? ? ? 最近,公司的項目不是很緊張散劫,閑來無事韧涨,隨便看看別人的代碼牍戚,學(xué)些其他的東西,了解下自己以前不知道的知識虑粥。
? ? ? 今天遇到UIViewController的一個屬性:edgesForExtendedLayout如孝。以前沒有用過,今天看到了就學(xué)習(xí)一下吧娩贷。這個屬性比較簡單第晰,高手請繞道。
? ? ? edgesForExtendedLayout是一個類型為UIExtendedEdge的屬性彬祖,指定邊緣要延伸的方向茁瘦。因為iOS7鼓勵全屏布局,它的默認(rèn)值很自然地是UIRectEdgeAll储笑,四周邊緣均延伸甜熔,就是說,即使視圖中上有navigationBar突倍,下有tabBar腔稀,那么視圖仍會延伸覆蓋到四周的區(qū)域盆昙。
? ? ? 我們看看官方文檔中的說法:
? ? ? 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。窗口的根視圖控制器不會影響該屬性焊虏。默認(rèn)值為UIRectEdgeAll淡喜。
? ? ? 那么具體該如何理解這個屬性呢?咱們用例子說話诵闭。我寫了一個簡單的測試程序炼团,在默認(rèn)情況下,即edgesForExtendedLayout屬性為UIRectEdgeAll的情況下涂圆,視圖看起來時是這樣的:
? ? ? 從上圖可以明顯的看到们镜,tabBar和navigationBar下面都透出點藍色,用reveal可以看的更加清楚:
? ? ? 然后我們接著來看一下屬性為其他值時候的情況润歉。為了方便模狭,并且看得更加清晰,我只把reveal上看到圖貼上來:
? ? ? 怎么樣踩衩?相信大家已經(jīng)看出不同的值所呈現(xiàn)出的結(jié)果了嚼鹉,但是要記住,在NavigationBar的時候驱富,Status Bar依舊是會記入UIView范圍的锚赤。
? ? ? 此外,我還發(fā)現(xiàn)另外一個問題褐鸥,就是當(dāng)我將self.edgesForExtendedLayout=UIRectEdgeNone放置在viewDidLoad方法中线脚,接著打印self.view的大小,發(fā)現(xiàn)其并沒有改變叫榕,在iphone6模擬器中打印的數(shù)據(jù)如下:
[HomeController viewDidLoad] x:0.00 y:0.00 width:375.00 height:667.00
但是在reveal中的尺寸確是這樣的:
? ? ? 而高度554 = 667(screen高度) - 20(statusBar高度) - 44(navigationBar高度) - 49(tabBar高度)浑侥。后來發(fā)現(xiàn),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方法中就構(gòu)建了UI肖卧,那么建議用約束來做,否則就要重新布局了~~