iOS难点总结iOS 开发 iOS琐碎知识点

edgesForExtendedLayout、automatic

2016-09-19  本文已影响848人  BrightFuture

前言

从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遮挡了
上一篇下一篇

猜你喜欢

热点阅读