viewController布局原理
自 iOS 7 以后蘋果開始默認對ViewController
采用全屏布局,全屏布局的意思就是ViewController
的 layout
是填滿整個屏幕的,這在 ViewController
界面中有 StatusBar(20)
、NavigationBar(44)
、TabBar(49)
、ToolBar(44)
的時候與以往的布局方式有著明顯的差異。全屏布局的情況下,ViewController
的 layout(self.view)
會被蓋在這些 Bar 下面。
伴隨著全屏布局,iOS 7 以后 View Controller 添加了幾個相關的屬性來方便我們來做頁面布局:
@property (nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll
@property (nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars NS_AVAILABLE_IOS(7_0); // Defaults to NO, but bars are translucent by default on 7_0.
@property (nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets NS_AVAILABLE_IOS(7_0); // Defaults to YES
- edgesForExtendedLayout
通過edgesForExtendedLayout
這個屬性來設置你的 View Controller 頁面的哪一側會延伸至屏幕邊緣。可選值為:
UIRectEdgeNone | UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight | UIRectEdgeAll
默認值是 UIRectEdgeAll,即 View Controller 的布局是全屏填滿。
在有NavigationBar
、TabBar
、TooBar
等系統 Bar 的情況下,該屬性設置為 UIRectEdgeAll
時,ViewController
的頁面會有一部分會被這些 Bar 蓋住部分;而當該屬性設為 UIRectEdgeNone
的時候,ViewController
的頁面布局會限制在這些 Bar 之間。
extendedLayoutIncludesOpaqueBars
這個屬性是對edgesForExtendedLayout
屬性的補充。
它的意思當NavigationBar
、TabBar
、TooBar
這些 Bar 不是半透明時(Bar 的 translucent 屬性值為 NO),如果設置extendedLayoutIncludesOpaqueBars
為NO
,則不會將ViewController
的頁面布局延伸至全屏,如果設置為YES
,則堅持延伸至全屏。
從 iOS 7 開始,NavigationBar
、TabBar
、TooBar
這些 Bar 默認都是半透明的,這時這個屬性不會起到效果。automaticallyAdjustsScrollViewInsets
當我們采用全屏布局設置了edgesForExtendedLayout
為UIRectEdgeAll
,而此時ViewController
的self.view
的第一個Subview
是UIScrollView
類型或其子類型(如:UITableView 等)時,automaticallyAdjustsScrollViewInsets
這個屬性就會被用來輔助我們對UIScrollView
類的視圖進行布局。automaticallyAdjustsScrollViewInsets
默認值即為 YES。
拿UITableView
來舉例,你希望你的UITableView
的內容從NavigationBar
底部開始展示(因為不這樣的話就會被 NavigationBar 遮住一部分),同時還需要在滑動時,UITableView 的布局又能填滿全屏。這時你只需要設置automaticallyAdjustsScrollViewInsets
為YES
即可,系統會幫你調整UITableView
的contentInset
來實現效果使其中的內容不會被NavigationBar
、TabBar
、ToolBar
擋住。你可以同樣在- (void)viewWillLayoutSubviews
觀察UITableView
的contentInset
的值。
基礎介紹
IOS的界面分為狀態欄和導航欄,狀態欄是指顯示電池、時間的最頂部的一個窄條,高度為20個點;而導航欄是緊接著狀態欄的44個點高度的橫條,一般用于顯示app標題,返回按鈕等操作按鈕。
在ios7之前,狀態欄和導航欄是分開的,而從ios7開始狀態欄和導航欄交織在一起了,狀態欄變為透明,導航欄的高度變為44+20=64:
- 全局狀態欄的設置
//設置狀態欄的字體顏色模式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//設置狀態欄是否隱藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];
我們不能隨意的對狀態欄的字體和顏色任意控制。只能設置兩種樣式。UIStatusBarStyleDefault
和UIStatusBarStyleLightContent
。
- 分頁面的狀態欄的設置
分頁面的情況下有兩種情況:
- 當VC屬于NavigationController的時候,在VC中添加方法
-(UIStatusBarStyle)preferredStatusBarStyle
{
//返回白色
return UIStatusBarStyleLightContent;
//返回黑色
//return UIStatusBarStyleDefault;
}
// 隱藏狀態欄
-(BOOL)prefersStatusBarHidden {
return YES;
}
為了保險起見,在view加載的某個階段比如viewWillAppear
中執行
[self setNeedsStatusBarAppearanceUpdate];
- 當VC屬于NavigationController的時候
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;