iOS導航欄和狀態欄

viewController布局原理

自 iOS 7 以后蘋果開始默認對ViewController 采用全屏布局,全屏布局的意思就是ViewControllerlayout 是填滿整個屏幕的,這在 ViewController界面中有 StatusBar(20)NavigationBar(44)TabBar(49)ToolBar(44) 的時候與以往的布局方式有著明顯的差異。全屏布局的情況下,ViewControllerlayout(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
  1. edgesForExtendedLayout
    通過edgesForExtendedLayout 這個屬性來設置你的 View Controller 頁面的哪一側會延伸至屏幕邊緣。可選值為:
UIRectEdgeNone | UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight | UIRectEdgeAll

默認值是 UIRectEdgeAll,即 View Controller 的布局是全屏填滿。
在有NavigationBarTabBarTooBar 等系統 Bar 的情況下,該屬性設置為 UIRectEdgeAll 時,ViewController 的頁面會有一部分會被這些 Bar 蓋住部分;而當該屬性設為 UIRectEdgeNone 的時候,ViewController 的頁面布局會限制在這些 Bar 之間。

  1. extendedLayoutIncludesOpaqueBars
    這個屬性是對edgesForExtendedLayout屬性的補充。
    它的意思當 NavigationBarTabBarTooBar 這些 Bar 不是半透明時(Bar 的 translucent 屬性值為 NO),如果設置 extendedLayoutIncludesOpaqueBarsNO,則不會將 ViewController 的頁面布局延伸至全屏,如果設置為YES,則堅持延伸至全屏。
    從 iOS 7 開始,NavigationBarTabBarTooBar 這些 Bar 默認都是半透明的,這時這個屬性不會起到效果。

  2. automaticallyAdjustsScrollViewInsets
    當我們采用全屏布局設置了edgesForExtendedLayoutUIRectEdgeAll,而此時ViewControllerself.view 的第一個SubviewUIScrollView 類型或其子類型(如:UITableView 等)時,automaticallyAdjustsScrollViewInsets
    這個屬性就會被用來輔助我們對UIScrollView 類的視圖進行布局。automaticallyAdjustsScrollViewInsets 默認值即為 YES。
    UITableView 來舉例,你希望你的UITableView 的內容從 NavigationBar 底部開始展示(因為不這樣的話就會被 NavigationBar 遮住一部分),同時還需要在滑動時,UITableView 的布局又能填滿全屏。這時你只需要設置 automaticallyAdjustsScrollViewInsetsYES 即可,系統會幫你調整 UITableViewcontentInset 來實現效果使其中的內容不會被 NavigationBarTabBarToolBar 擋住。你可以同樣在 - (void)viewWillLayoutSubviews觀察UITableViewcontentInset 的值。

基礎介紹

IOS的界面分為狀態欄和導航欄,狀態欄是指顯示電池、時間的最頂部的一個窄條,高度為20個點;而導航欄是緊接著狀態欄的44個點高度的橫條,一般用于顯示app標題,返回按鈕等操作按鈕。
在ios7之前,狀態欄和導航欄是分開的,而從ios7開始狀態欄和導航欄交織在一起了,狀態欄變為透明,導航欄的高度變為44+20=64:

  1. 全局狀態欄的設置
//設置狀態欄的字體顏色模式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//設置狀態欄是否隱藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];

我們不能隨意的對狀態欄的字體和顏色任意控制。只能設置兩種樣式。UIStatusBarStyleDefaultUIStatusBarStyleLightContent

  1. 分頁面的狀態欄的設置
    分頁面的情況下有兩種情況:
  • 當VC屬于NavigationController的時候,在VC中添加方法
-(UIStatusBarStyle)preferredStatusBarStyle
{ 
    //返回白色
    return UIStatusBarStyleLightContent;
    //返回黑色
    //return UIStatusBarStyleDefault;
}
// 隱藏狀態欄
-(BOOL)prefersStatusBarHidden {
    return YES;
}

為了保險起見,在view加載的某個階段比如viewWillAppear中執行

[self setNeedsStatusBarAppearanceUpdate];
  • 當VC屬于NavigationController的時候
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
NavigationController管理

導航欄

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,255評論 4 61
  • 我又想起了417的姑娘們,417是我們大學宿舍的門牌號,也是我們大學生活四年的后宮,是我們的樂園,是我們的戰場,也...
    南木笙閱讀 468評論 0 0
  • 我總在想,總想寫,卻在提手間心生退卻,但我卻必須為他寫些什么。 如果寫,那我還是得從初中開始寫,盡管那個時候的我過...
    MG寒寒閱讀 324評論 0 0
  • 三年前,在鄭州工作的時候,老領導馬總曾講過這樣一個故事,當時令我感觸頗深。 馬總的妻妹,我們姑且稱呼她小高,90后...
    我是姜燕妮閱讀 182評論 0 1
  • 我喜歡仰望沒有一絲云彩的藍天,清澈澄明,有讓我浮躁的心平靜下來的魔力。
    333455adff2d閱讀 201評論 0 0