edgesForExtendedLayout、automatic

作者: BrightFuture | 来源:发表于2016-09-19 00:04 被阅读848次

    前言

    从iOS7开始,UIViewController默认使用全屏布局,并增加了edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars这三个属性用于控制布局

    edgesForExtendedLayout

    该属性能够使控制器的view向四周延伸,直到view占据整个屏幕。该属性默认值为UIRectEdgeAll(向四周延伸),如果设为UIRectEdgeNone(不延伸),view就会从navigationBar的底部开始到tabBar上边结束。


    UIRectEdgeAll01(view的尺寸等于屏幕的大小)
    UIRectEdgeAll 02(透过navigationBar和tabBar可以看到红色)

    由上图可以看出,view确实是铺满了整个屏幕

    UIRectEdgeNone01(viewDidLoad中view的尺寸等于屏幕,而在快要显示时变短了)
    UIRectEdgeNone02(不能透过navigationBar和tabBar看到view)

    由上图可以看出,在UIRectEdgeNone下,最终view会显示在navigationBar和tabBar之间,但是在设置edgesForExtendedLayout为UIRectEdgeNone时,view的frame并不是立即就修改了,而是在viewDidLoad方法后系统会根据多重约束关系来重新设置view的frame,这也证明在viewDidLoad方法中拿到的view的frame并不一定是准确的

    automaticallyAdjustsScrollViewInsets

    这个属性常用于当控制器view为UIScrollView或者其子类(如UITableView)时。在edgesForExtendedLayout = UIRectEdgeAll的情况下,如果view是UIScrollView或者其子类时,scrollView最顶部的内容在还未滚动时就会被navigationBar遮挡住,如下图所示

    tableView顶部内容被遮挡
    如果同过设置edgesForExtendedLayout = UIRectEdgeNone,会发现虽然scrollView最顶部的内容出现在了navigationBar的下面,但是在往上滚动时,不能透过navigationBar看到滚动上去的视图,用这种方式并不是一个非常好的效果。
    UIRectEdgeNone滚动前
    UIRectEdgeNone滚动后
    automaticallyAdjustsScrollViewInsets应运而生,当它为YES时(默认就是YES,上面为了测试效果故意设置其为NO),它可以使scrollView最顶部内容出现在navigationBar下面,并且在往上滚动时能够透过navigationBar看到滚动上去的view的内容(实际上就是给view增加了内边距contentInset)
    automaticallyAdjustsScrollViewInsets=YES滚动前
    automaticallyAdjustsScrollViewInsets=YES滚动后
    tableView的contentInset被改变了

    extendedLayoutIncludesOpaqueBars

    该属性默认为NO,我们上面讨论的edgesForExtendedLayout属性是在navigationBar/tabBar为透明的情况下的(navigationBar/tabBar默认情况下是透明的),然而在navigationBar/tabBar为不透明时,如果edgesForExtendedLayout 为 UIRectEdgeAll,发现view并没有延伸到全屏,而是出现在navigationBar与tabBar之间(就像UIRectEdgeNone的效果一样),如下图所示


    view的尺寸不等于屏幕尺寸
    绿色块完全显示,view处于navigationBar和tabBar之间

    此时设置extendedLayoutIncludesOpaqueBars = YES,效果如下图


    view尺寸等于屏幕尺寸
    绿色块只显示了一部分,另外一部分被navigationBar遮挡了

    相关文章

      网友评论

      • iOS学习着ne:言简意赅,例子清晰,感谢。另外加上,现在的iOS11之后ViewController里的automaticallyAdjustsScrollViewInsets方法,改成了UIScrollView里面的的contentInsetAdjustmentBehavior方法来替换了,就更好了。

        @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES
        iOS学习着ne:这个不改的话导致了push ,pop 多了额外的动画,
      • 扛支枪:多谢分享,mark
      • 峰子1994:转载下
      • 虾米斗士:3个属性介绍的很详细,非常感谢,学习了。

      本文标题:edgesForExtendedLayout、automatic

      本文链接:https://www.haomeiwen.com/subject/baygettx.html