參考文章:
http://stackoverflow.com/questions/18798792/explaining-difference-between-automaticallyadjustsscrollviewinsets-extendedlayo
http://redth.codes/ios7-full-screen-layout/
iOS 7以后在ViewController里面引進了一系列屬性用於管理頁面布局。
下面是Apple官方提供的文檔解釋,看過之后還是覺得太過於抽象,於是用代碼來實驗吧。
automaticallyAdjustsScrollViewInsets 
A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets.
extendedLayoutIncludesOpaqueBars 
 
           
 
           - (void)viewDidLoad {
    [super viewDidLoad];
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
 
            將edgesForExtendedLayout設置成UIRectEdgeNone,表明View是不要擴展到整個屏幕的。頁面效果如下:
 
UIRectEdge是個枚舉類型,其他的值通過字面意思也是非常容易理解的。
typedef enum : NSUInteger {
   UIRectEdgeNone   = 0,
   UIRectEdgeTop    = 1 << 0,
   UIRectEdgeLeft   = 1 << 1,
   UIRectEdgeBottom = 1 << 2,
   UIRectEdgeRight  = 1 << 3,
   UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight 
} UIRectEdge;
 
            
automaticallyAdjustsScrollViewInsets 
 
            這個屬性用於如果頁面是ScrollView或者UITableView,通常我們希望ScrollView或者UITableView內容顯示是在UINavigation Bar下面。
通過設置edgesForExtendedLayout = UIRectEdgeNone或者self.navigationController.navigationBar.translucent = NO;可以讓view的布局從UINavigation Bar下面開始,不過一個副作用就是當頁面滑動的時候,view是沒有辦法占據全屏的。
automaticallyAdjustsScrollViewInsets就可以很好的完成這個需求。
self.automaticallyAdjustsScrollViewInsets = NO;

這時UITableView會被UINavigation Bar遮擋住。
self.automaticallyAdjustsScrollViewInsets = YES;

這時可以看到UITableView的內容會從UINavigation Bar下面開始,並且這個頁面的View還是占據整個屏幕的,所以這一個屬性完全搞定!
extendedLayoutIncludesOpaqueBars
如果狀態欄是不透明的,那么頁面的布局默認是不會包含狀態欄的,除非將這個屬性設置成為YES。所以如果你的頁面擴展到Navigation Bar (edgesForExtendedLayout=UIRectEdgeAll),要是這個屬性設置成NO (default), 如果狀態欄是不透明的話,頁面是不會擴展到狀態欄的。
在這篇文章http://redth.codes/ios7-full-screen-layout/里面提到有些時候automaticallyAdjustsScrollViewInsets並不能幫助我們正常計算ScrollView/TableView的Inset,這時候就自己設置咯。
self.myTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
有興趣同學可以關注微信公眾號奶爸碼農,不定期分享投資理財、IT相關內容:
 
              