解決iOS7視圖控制器的View整體上移20個像素
當我們在使用Xcode5創建一個新的項目的時候,我們會發現之前運行在iOS6上面的App整體的視圖都向上移動了20個像素點,因為 iOS 7 把整個屏幕高度(包括狀態欄和導航欄)都作為了視圖控制器的有效高度,於是iOS6上的控制器視圖和上面的狀態欄交疊在一起了。
關於這個問題,我們的解決方法:
蘋果在升級到ios7的時候已經考慮到控制器視圖整體上移的這個問題,於是就在iOS7 SDK中為視圖控制器添加了一個新的屬性edgesForExtendedLayout,將此屬性設置為UIRectEdgeNone,然后所有ViewController的View就整體上移了20個像素點。
為了我們的App可以同時支持iOS6和iOS7,為了方便,我們可以建立一個BaseViewController,重寫它的ViewDidLoad方法,代碼如下
- (void)viewDidLoad { [super viewDidLoad]; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIExtendedEdgeNone; } #else float barHeight =0; if (!isIPad()&& ![[UIApplication sharedApplication] isStatusBarHidden]) { barHeight+=([[UIApplication sharedApplication]statusBarFrame]).size.height; } if(self.navigationController &&!self.navigationController.navigationBarHidden) { barHeight+=self.navigationController.navigationBar.frame.size.height; } for (UIView *view in self.view.subviews) { if ([view isKindOfClass:[UIScrollView class]]) { view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height - barHeight); } else { view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height); } } #endif }
使用宏 __IPHONE_OS_VERSION_MAX_ALLOWED 判斷當前是否是iOS7及其以上的版本。>7.0則使用新的 edgesForExtendedLayout API,遍歷子視圖逐個下移 subviews,並自動根據狀態欄/導航欄的可視狀態計算要移動的偏移量。
注:如果已升級至Xcode5,將導航控制器的 Top Bar 設置為一種“Opacque ...”(不透明)類型可解決此問題。