iOS 7:用代码解决视图控制器的View总体上移问题

若是你准备将你的老的 iOS 6 app 迁移到 iOS 7 上,那么你必须注意了。当你的老的 app 在 iOS 7 设备上运行时,全部ViewController 的视图都总体上移了,由于 iOS 7 把整个屏幕高度(包括状态栏和导航栏)都做为了视图控制器的有效高度。因而你的视图上移了,并和上层的状态栏交叠在一块儿。app

你固然能够在 Xcode 中修改每一个 View,将他们下移20个像素(状态栏高度)或者64个像素(状态栏+导航栏高度)。spa

可是苹果显然已经考虑到这个问题,他们在 iOS 7 SDK 中为 ViewController 提供了一个 edgesForExtendedLayout 新属性。若是你将这个属性设置为UIRectEdgeNone,则 viewController 的全部子视图都会自动调整,这样在 iOS 7 下看到的效果和 iOS 6 彻底同样。.net

为了方便,你能够为 UIViewController 扩展一个子类,并覆盖它的 viewDidLoad 方法:code

@implementation DerivedViewControllerorm

- (void)viewDidLoad继承

{get

    [superviewDidLoad];it

if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])io

       self.edgesForExtendedLayout = UIRectEdgeNone;class

}

@end

而后你之后全部的 ViewController 都从这个 DerivedViewController 类继承。

但不幸的是,咱们的程序仍然有大量 iOS<7 的用户 ,咱们没法当即抛弃对 iOS 6 的支持。不管 edgesForExtendedLayout 仍是UIRectEdgeNone,都只能在 iOS7 下有效。对于 iOS 6,我将以上代码修改成:

- (void)viewDidLoad

{

    [superviewDidLoad];

#if__IPHONE_OS_VERSION_MAX_ALLOWED >= 70000

    if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])

       self.edgesForExtendedLayout = UIRectEdgeNone;

#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 *viewin 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 判断 deployment target 是否 >7.0。>7.0则使用新的 edgesForExtendedLayout API,负责使用比较笨的方法逐个下移 subviews,并自动根据状态栏/导航栏的可视状态计算要移动的偏移量。

注:若是已升级至Xcode5,将导航控制器的 Top Bar 设置为一种“Opacque ...”(不透明)类型可解决此问题

相关文章
相关标签/搜索