iphone4/4s 應用程序升級適配 iphone5 的方法有很多,而且其中原理在網上也找的到。本次廢話不多說,單簡要敘述我的過程:
綜合權衡,我選擇用 增加xib文件的方法。
第一步:
為需要適配找到工程中需要適配iphone5的xib文件,加入是AViewController。
首先,到工程文件目錄下,找到AViewController.xib文件,然后在同一文件夾下拷貝一份,重命名為AViewController_ip5.xib 文件。
第二步:
將AViewController_ip5.xib 添加到工程中;
因為AViewController_ip5.xib文件是AViewController.xib的拷貝,我們甚至連它與AViewController.h/.m文件之間的關聯都不需要做。(如果你是自己手動創建了一個xib文件,那么你需要為其關聯一個類,方法參加:手動關聯xib文件)
第三步:
選中AViewController_ip5.xib中的view,在右側的attributes inspector -> simulated metrics ->size 下將view的size 設置為retina 4 full screen,此時,view就變成iphone5的4英寸了。
根據你的需要對xib文件中的元素進行位置調整。
第四步:
在需要用到AViewController.xib和AViewController_ip5.xib的controller的.m文件中,增加以下宏,判斷設備是否是iphone5
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
然后,在用到AViewController.xib和AViewController_ip5.xib文件的代碼中做個判斷即可,如下所示例:
if (iPhone5) { IndexViewController *myIndexViewController = [[IndexViewController alloc]initWithNibName:@"IndexViewController_ip5" bundle:nil]; [self.view addSubview:myIndexViewController.view]; }else{ IndexViewController *myIndexViewController = [[IndexViewController alloc]initWithNibName:@"IndexViewController" bundle:nil]; [self.view addSubview:myIndexViewController.view]; }
ok,大功告成!
DeBug:
寫代碼,要是沒幾個錯誤,那還有什么樂趣呢?
使用上述方法過程中你可能會遇到的幾個問題:
1、系統拋出:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/38AF505B-F07C-4CD5-8752-E0E8783330CB/hall.app> (loaded)' with name 'UserinfoOnNavibar'
原因:英語直譯 因為“內部的不協調、不一致導致的異常”,所以無法加載NIB 文件;
實際的原因是,我直接拷貝了一個在xcode4.3下創建的xib文件改名后,在xcode4.5中用以上方法適配iphone5 時結果系統拋出如上錯誤。
解決方案:不要再用拷貝的方法了,自己手工在xcode4.5下建一個你要的xib文件吧。
2、遇到一個scrollview 不能滾動的現象;
解決方案: 將在xcode 4.3下拖動到xib文件上的scrollview 刪除,然后重新在xcode4.5下重新拖動一個scollview到xib文件上。然后關聯一下即可。不需要修改任何代碼。