40.iOS6与iOS7屏幕适配 edgesForExtendedLayout

日常开发中, 在有导航栏的情况下, iOS6.0和 iOS7.0的布局在同样的 frame下会呈现出不同的效果. 今天就来说一说 iOS6.0和 iOS7.0的屏幕适配, iOS6.0虽然久远, 但是还是有一批这样用户的, 所以有时候还需要照顾到.

有导航栏时, 默认效果

    UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    aView.backgroundColor = [UIColor redColor];
    [self.view addSubview:aView];

在没有导航栏时, 如上写的话效果一致, 有导航栏时效果如下:
iOS6.0效果:
40.iOS6与iOS7屏幕适配 edgesForExtendedLayout_第1张图片
iOS7.0效果:

如何才能统一, 使iOS6.0和 iOS7.0屏幕适配

UIViewController 中有个参数edgesForExtendedLayout, 是控制边缘延伸布局的.
iOS6此参数默认为UIRectEdgeNone,iOS7鼓励全屏布局, 默认值很自然地是UIRectEdgeAll,四周边缘均延伸,就是说,如果即使视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。

edgesForExtendedLayout

将iOS7也改为UIRectEdgeNone, 便可达到适配:

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }

contentInset

在控制器的view是UIScrollView, 如UITableView/UICollectionView中, 我们也可以通过contentInset参数来控制, 它是 UIScrollview 的属性, 也是来控制内延的.所以也有了如下总结:

    //控制器的view是普通的UIView,如 UIViewController , 通过edgesForExtendedLayout参数来增加内延, 使 iOS7以后达到 iOS6的效果
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }

    //控制器的view是UIScrollView, 如UITableView/UICollectionView
    self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
    self.collectionView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);

具体需要内延的方向和距离需要跟据开发中你遇到的情况和布局特点了决定的.

无导航栏情况下适配

// iOS7 && 没有包装导航控制器
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0 && self.navigationController == nil) {
        CGFloat top = [self.topLayoutGuide length];

        //控制器的view是UIScrollView, 如UITableView/UICollectionView
        if ([self.view isKindOfClass:[UIScrollView class]]) {
            UIScrollView *scroll = (UIScrollView *)self.view;
            scroll.contentInset = UIEdgeInsetsMake(top, scroll.contentInset.left, scroll.contentInset.bottom, scroll.contentInset.right);
        }else{
            //控制器的view是普通的UIView,如 UIViewController
            CGRect bounds = self.view.bounds;
            bounds.origin.y =  - top;
            self.view.bounds = bounds;
        }
    }

延伸阅读

假如在 iOS7中布局一个 UITableviewController 或者在 UIViewController 中布局一个tableview 的时候, 你发现会有一些与上述不太一致的问题.请了解
41.automaticallyAdjustsScrollViewInsets/extendedLayoutIncludesOpaqueBars

参考资料:http://www.th7.cn/Program/IOS/201312/167099.shtml

你可能感兴趣的:(屏幕适配,iOS6适配,iOS6和iOS7)