最近,公司的项目不是很紧张,闲来无事,随便看看别人的代码,学些其他的东西,了解下自己以前不知道的知识。
今天遇到UIViewController的一个属性:edgesForExtendedLayout。以前没有用过,今天看到了就学习一下吧。这个属性比较简单,高手请绕道。
edgesForExtendedLayout是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向。因为iOS7鼓励全屏布局,它的默认值很自然地是UIRectEdgeAll,四周边缘均延伸,就是说,即使视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。
我们看看官方文档中的说法:
This property is applied only to view controllers that are embedded in a container such asUINavigationController. The window’s root view controller does not react to this property. The default value of this property isUIRectEdgeAll.
官方文档中说的很明确:这个属性仅仅用于嵌在容器(比如:UINavigationController)中的view controllers。窗口的根视图控制器不会影响该属性。默认值为UIRectEdgeAll。
那么具体该如何理解这个属性呢?咱们用例子说话。我写了一个简单的测试程序,在默认情况下,即edgesForExtendedLayout属性为UIRectEdgeAll的情况下,视图看起来时是这样的:
从上图可以明显的看到,tabBar和navigationBar下面都透出点蓝色,用reveal可以看的更加清楚:
然后我们接着来看一下属性为其他值时候的情况。为了方便,并且看得更加清晰,我只把reveal上看到图贴上来:
怎么样?相信大家已经看出不同的值所呈现出的结果了,但是要记住,在NavigationBar的时候,Status Bar依旧是会记入UIView范围的。
此外,我还发现另外一个问题,就是当我将self.edgesForExtendedLayout=UIRectEdgeNone放置在viewDidLoad方法中,接着打印self.view的大小,发现其并没有改变,在iphone6模拟器中打印的数据如下:
[HomeController viewDidLoad] x:0.00 y:0.00 width:375.00 height:667.00
但是在reveal中的尺寸确是这样的:
而高度554 = 667(screen高度) - 20(statusBar高度) - 44(navigationBar高度) - 49(tabBar高度)。后来发现,self.edgesForExtendedLayout=UIRectEdgeNone放置在viewDidLoad方法中,viewWillAppear方法中self.view的大小为(0, 64, 375, 554);self.edgesForExtendedLayout=UIRectEdgeNone放置在viewWillAppear方法中,viewDidAppear方法中self.view的大小为(0, 64, 375, 554),而如果self.edgesForExtendedLayout=UIRectEdgeNone放置在viewDidAppear方法中,则该属性就起不了作用了。具体原因自己有点小猜测,但是并不肯定,还望大神指点。
综上所述,如果在viewDidLoad方法中就构建了UI,那么建议用约束来做,否则就要重新布局了~~