edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用

前言

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

edgesForExtendedLayout

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


edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第1张图片
UIRectEdgeAll01(view的尺寸等于屏幕的大小)

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第2张图片
UIRectEdgeAll 02(透过navigationBar和tabBar可以看到红色)

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

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第3张图片
UIRectEdgeNone01(viewDidLoad中view的尺寸等于屏幕,而在快要显示时变短了)

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第4张图片
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遮挡住,如下图所示

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第5张图片
tableView顶部内容被遮挡

如果同过设置edgesForExtendedLayout = UIRectEdgeNone,会发现虽然scrollView最顶部的内容出现在了navigationBar的下面,但是在往上滚动时,不能透过navigationBar看到滚动上去的视图,用这种方式并不是一个非常好的效果。
edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第6张图片
UIRectEdgeNone滚动前

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第7张图片
UIRectEdgeNone滚动后

automaticallyAdjustsScrollViewInsets应运而生,当它为YES时(默认就是YES,上面为了测试效果故意设置其为NO),它可以使scrollView最顶部内容出现在navigationBar下面,并且在往上滚动时能够透过navigationBar看到滚动上去的view的内容(实际上就是给view增加了内边距contentInset)
edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第8张图片
automaticallyAdjustsScrollViewInsets=YES滚动前

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第9张图片
automaticallyAdjustsScrollViewInsets=YES滚动后

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第10张图片
tableView的contentInset被改变了

extendedLayoutIncludesOpaqueBars

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


edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第11张图片
view的尺寸不等于屏幕尺寸

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第12张图片
绿色块完全显示,view处于navigationBar和tabBar之间

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


edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第13张图片
view尺寸等于屏幕尺寸

edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用_第14张图片
绿色块只显示了一部分,另外一部分被navigationBar遮挡了

你可能感兴趣的:(edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets及extendedLayoutIncludesOpaqueBars的使用)