iOS 7 :解決ViewController的View整體上移的問題


解決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 ...”(不透明)類型可解決此問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM