從iOS7開始盗温,控制器就默認添加了全屏屬性,因此成肘,你就有更多的方式去操作view的布局卖局,具體用到的屬性包括:
- edgesForExtendedLayout
- automaticallyAdjustsScrollViewInsets
- extendedLayoutIncludesOpaqueBars
edgesForExtendedLayout
我們可以根據(jù)以上屬性設(shè)置view的鋪滿樣式。
想象一下双霍,默認情況下砚偶,我們從一個普通的UIViewController跳轉(zhuǎn)到一個UINavigationController,view默認的展示樣式是從導(dǎo)航欄底部開始洒闸。
但是你可以通過設(shè)置edgesForExtendedLayout
為不同類型來控制view的樣式(top, left, bottom, right)染坯。
可以看一下例子:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
你沒有設(shè)置edgesForExtendedLayout
的值,其默認的值是UIRectEdgeAll
丘逸,所以view是延伸到整個屏幕的高度单鹿。
效果如下圖:
![](https://i.stack.imgur.com/MOB6v.png)
如你所見,紅色背景延伸到了狀態(tài)欄(status bar)下面深纲。
假若你將 edgesForExtendedLayout
的值設(shè)置為UIRectEdgeNone
仲锄,意味著你告訴view不要講其擴展到整個屏幕。
其效果如下:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
![](https://i.stack.imgur.com/ojAvO.png)
關(guān)于另外一個屬性automaticallyAdjustsScrollViewInsets
.
這個屬性屬于UIScrollView或包含UIScrollView的控制器(比如UITableView繼承自UIScrollView湃鹊,UIWebView中也包含UIScrollView)儒喊。
如果你想要你的view從導(dǎo)航欄底部開始,但是在滑動時币呵,讓其穿透到導(dǎo)航欄的底部怀愧。
在這種情況下,如果你將edgesForExtendedLayout
設(shè)置為UIRectEdgeNone
余赢,雖然可以從導(dǎo)航欄底部開始芯义,但滑動時無法穿透到導(dǎo)航欄底部。
怎么辦呢妻柒?
這時候就顯示出automaticallyAdjustsScrollViewInsets
的作用了扛拨。
如果你將edgesForExtendedLayout
的值設(shè)置為UIRectEdgeAll
,automaticallyAdjustsScrollViewInsets
設(shè)置為YES(edgesForExtendedLayout
默認為UIRectEdgeAll
蛤奢,automaticallyAdjustsScrollViewInsets
默認就是YES),就能實現(xiàn)上述需求鬼癣。
具體如下圖:
![](https://i.stack.imgur.com/9Iapl.png)
上圖是將
edgesForExtendedLayout
設(shè)置為UIRectEdgeAll
,automaticallyAdjustsScrollViewInsets
默認就是NO的情況)啤贩。
下圖是將edgesForExtendedLayout
設(shè)置為UIRectEdgeAll
待秃,automaticallyAdjustsScrollViewInsets
默認就是YES的情況)(也就是系統(tǒng)默認情況)
![](https://i.stack.imgur.com/VVQHQ.png)
關(guān)于另外一個屬性。
字面意思是:是否延伸到包含不透明的狀態(tài)欄痹屹。
-
extendedLayoutIncludesOpaqueBars
這個值是一個補充,默認值是NO;
默認的蘋果的狀態(tài)欄(status bar)是透明的章郁。如果狀態(tài)欄不透明,這個試圖就不回擴展到不透明的狀態(tài)欄底部,除非將其值設(shè)置為YES
This value is just an addition to the previous ones. If the status bar is opaque, the views won't be extended to include the status bar too, unless this parameter is YES.
所以如果狀態(tài)欄不透明暖庄,即使你設(shè)置edgesForExtendedLayout
為UIRectEdgeAll
聊替,extendedLayoutIncludesOpaqueBars
為NO(默認如此),view不會延伸到狀態(tài)欄底部的培廓。
怎么判斷UIScrollView在使用惹悄?
iOS會抓取控制器view的第一個子視圖,(也就是index = 0)肩钠,如果是UIScrollView或者UIScrollView的子類泣港,就可以使用上文描述的屬性。
如果視圖是普通的UIView价匠,可以添加一個線來解決当纱。
self.navigationController.navigationBar.translucent = NO;