標籤:

維護一套同時兼容 iOS 6 和 iOS 7,並且能夠自動適應兩個系統的 UI 風格的代碼,真實難度到底如何?


瀉藥。難度的話,知乎日報花了兩天時間。

1. 修改我們的 ViewController 基類,無論在 iOS 几上左上角坐標都固定在狀態欄下面。

2. 基類中增加自製的狀態欄和導航欄。自動在兩個系統上顯示成兩種風格,包括標題欄顏色,玻璃效果,按鈕樣式字體等。

3. 各個子 ViewController 根據自己的需要定製自己需要狀態欄和導航欄樣式。

4. 修正 iOS 7 的一些變了的地方,比如 UITableViewCell 背景默認白色。

這樣,在 iOS 6 上外觀沒有任何變化,在 iOS 7 上變成了 iOS 7 的風格。

敬請期待新版~


不去修改交互模式和動畫效果的話,僅僅是一般的軟體動態換膚功能,而且只增加一個皮膚,可以說沒什麼難度。

不過風格太過依賴蘋果,不怕迷失自我嗎


題主可以仔細讀讀iOS 7 UI Transition Guide: Supporting iOS 6

自然會有答案


個人覺得沒有所謂的適應ios6或者是ios7的UI風格必要,一套好的UI風格並不會由於os的風格有太大的影響,ios7之前 扁平 簡單UI風格的App也有很多,大家也不會覺得變扭,反而覺得眼前一亮。對於蘋果這種一直向前,摒棄舊版本的風格,作為一個App也應該有所秉承。


其實都不建議同時維護二套圖標的,這個沒有必要啊.

如果一定要維護.....

那我從開發設計的角度來講,認為是不大的.

第一,先保證你的ios6圖標與ios7圖標大小全部一致,或者需要放到的地方全部一致.

第二,再保證命名的後綴一致,例 ios6圖標是:logo.png;bg.png;那ios7圖標是:logo7.png;bg7.png;

第三,所有需要用到做圖片顯示的代碼全部統一調用指定的圖片載入類.或者說,你所有圖片名定義都寫在一個類里.

第四,在上述類里,判斷是否是ios7系統,如果是ios7系統...則自動在圖片名後加一個7來直接載入ios7的圖標,默認則載入ios6的圖標.

當年我們做過這方面的圖片統一載入的代碼.所有的圖片載入,都是來自於一個類,圖片命名,都是來自於一個類...後面發現,雖然平時各模塊的開發人員,調用起來不太方便,但是統一的圖片處理,確是方便很多.

還是做部分代碼過來看看吧,圖片資源都是統一管理的.

#ifndef _RES_LOGIN_H_

#define _RES_LOGIN_H_

#define IMG_LOGINPAGE_SHADOW @"bg12#0_1_0_1#.png" /*導航條陰影 */

#define IMG_LOGINPAGE_CENTER @"bg_mainLogin.png" /*界面中心的圖,被刻度盤包住的部分 */

#define IMG_LOGINPAGE_GRADUATION @"bg_login_graduation.png" /*刻度盤 */

#define IMG_LOGINPAGE_LOGIN @"button_login_hint.png" /*登錄按鈕(未選中) */

#define IMG_LOGINPAGE_LOGIN_SELECTED @"button_login_click.png" /*登錄按鈕(選中) */

#define IMG_LOGINPAGE_REFRESH_VALIFICATIONCODE @"refresh_ValificationCode.png" /*顯示重新刷新驗證碼的圖片 */

#define IMG_LOGINPAGEINFO_INFORMATION @"infomation_back.png" /*顯示幫助info文字的圖片 */

#define IMG_LOGINPAGEINFO_BUTTON_REGISTER @"button_register.png" /*註冊的按鈕(未選中)的圖片 */

#define IMG_LOGINPAGEINFO_BUTTON_REGISTERSELECTED @"button_register_selected.png" /*註冊的按鈕(選中)的圖片 */

#define IMG_LOGINPAGEINFO_BUTTON_FIND_PASSWORD @"button_find_password.png" /*找回密碼按鈕(選中)的圖片 */

#define IMG_LOGINPAGEINFO_BUTTON_FIND_PASSWORDSELECTED @"button_find_password_selected.png" /*找回密碼按鈕(未選中)的圖片 */

#endif /* _RES_LOGIN_H_ */


只是圖片的話實現起來難度不大.直接上代碼吧.

舉例:

ios6:test.png

ios7:ios7_test.png

在ios7Image.plist中添加 "test"

PS:如果要統一成ios7風格,可以看看UI7Kit youknowone/UI7Kit 路 GitHub

@implementation UIImage (HT)

static NSArray *ios7Images;

+ (void)load {

if (IOS7) {

static dispatch_once_t once;

dispatch_once( once, ^{

ios7Images = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"iOS7Images" ofType:@"plist"]];

[NSObject swizzleClassMethod:self from:@selector(imageNamed:) to:@selector(custom_imageNamed:)];

});

}

}

+ (UIImage *)custom_imageNamed:(NSString *)imageName {

if ([ios7Images containsObject:imageName]) {

return [self custom_imageNamed:[NSString stringWithFormat:@"ios7_%@",imageName]];

}

return [self custom_imageNamed:imageName];

}

@end

OK,圖片多的時候怎麼辦呢?設計師弄好全部以ios7_開頭命名的圖片,放到一個目錄,然後代碼

NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentPath = [searchPaths objectAtIndex:0];

NSString *path = [documentPath stringByAppendingString:@"/images"];

NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL];

NSMutableArray *array = [NSMutableArray array];

for (NSString *file in files) {

if ([file isEqualToString:@".DS_Store"]) {

continue;

}

NSString *temp = [file stringByReplacingOccurrencesOfString:@"ios7_" withString:@""];

temp = [temp stringByReplacingOccurrencesOfString:@"@2x" withString:@""];

temp = [temp stringByReplacingOccurrencesOfString:@".png" withString:@""];

if ([array containsObject:temp]) {

continue;

}

[array addObject:temp];

}

NSString *plistPath = [documentPath stringByAppendingString:@"/iOS7Images.plist"];

[array writeToFile:plistPath atomically:YES];


技術上這並不困難,但是這個問題同大多數軟體可能面臨的問題一樣,它是個管理問題而非技術問題。

從我的角度,無論是兩套界面還是一套自適應界面,都意味著這個界面有兩種形式,從代碼的角度就意味著,相似的代碼會有兩個不同的分支,而這最終都意味著:測試人員必須把所有的測試案例在兩種界面下各運行一遍!換句話說就是,測試人員的工作量加倍了。——至於測試人員的工作量究竟有多大?以我的經驗是測試人員的工作量大於開發人員的工作量。

如果,從管理的角度,你偷個懶,不要求測試用兩個不同界面把所有測試案例重新運行一遍,那麼結果很可能是,在某些界面下的適配並不完美,因為沒有測試到的地方都是有可能出錯的。

即便現在不出錯,將來開發會不斷的修改代碼,而每次修改代碼的時候,都可能存在,改了代碼的一個分支沒有修改另外一個分支的問題,絕大多數情況下,開發者是只測試自己擁有的設備,那麼通常只能保證他自己的系統適配了,至於另外一個系統呢?——等測試報告了bug再說吧。


推薦閱讀:

iOS 7 通知中心裡的未讀通知有什麼用?
iOS 7 支持 Wi-Fi Hotspot 2.0,這個特性有什麼用?
Google Android 的 Material Design 是否在與 iOS 7 趨同?
為什麼 iOS 7 和 OS X 之間的 AirDrop 不能互傳?
iOS 7 在正式版的發布時會調整 UI 么?

TAG:iOS開發 | iOS7 |