ios7版本之後,增加了很多新的屬性,其中包括頁面起始點從螢幕最左上角(0,0)點開始,這給頁面适配帶來了很大問題。首先說說純代碼頁面:
1、edgesForExtendedLayout
這個屬性我們字面上裡面是四周延生,指定邊緣要延伸的方向,IOS7鼓勵全屏布局模式,預設值是UIRectEdgeAll。
沒用過的人可能不知道這是什麼意思,舉例假如我們頁面上面有導航了,這個時候頁面起始點仍然從狀态欄上方開始計算,舉例子你一個視圖要全屏顯示就要設定成:
CGRectMake(0, 64, SCREENW, self.view.frame.size.height - 64)
假如我們想從導航欄下面開始計算起始點,可以設定成UIRectEdgeNone或者UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
2、extendedLayoutIncludesOpaqueBars
這個屬性看單詞的意思,延伸視圖包含不包含不透明的Bar,是用來指定導航欄是透明的還是不透明,IOS7中預設是YES,當滾動頁面的時候我們隐約能在導航欄下面看到我們頁面的試圖:

但是當我們設定一張不透明的圖檔作為導航欄背景時,該屬性就會變成NO,這樣不透明以後我們可以人為設定成YES達到延伸至導航欄的效果:
UINavigationBar *bar = [UINavigationBar appearance];
[bar setBackgroundImage:[UIImage imageNamed:@"navBg.png"] forBarMetrics:UIBarMetricsDefault];//設定圖檔導航欄是不透明的
假如我們如下設定,extendedLayoutIncludesOpaqueBars仍然是YES
[bar setBarTintColor:[UIColor whiteColor]];
這個屬性一定意義上來說效果跟上一個屬性一樣,以下兩個屬性任何一個設定成不可延伸至導航欄都會讓頁面起始點從導航欄下面開始
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
我們要設定一個全屏的頁面就要設定frame為:
CGRectMake(0, 0, SCREENW, self.view.frame.size.height - 64)
同理,隻有到兩個屬性都設定成可以延伸時,頁面起始點才會從狀态欄也就是螢幕最左上角開始
3、automaticallyAdjustsScrollViewInsets
由詞意可是是否自動判斷滾動視圖的内邊距,要說這個Insets呢我們就要首先說說scroll視圖contentInset這個屬性,
typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;
看這個結構體定義我們可以清楚地看到上左下右,從我找的一張圖來看看到底是什麼:
也就是在contentSize的周圍增加了一圈額外的滾動區域,就是相當于contentSize大了一圈。
注意:該屬性在ios7中預設開啟,也就是說滾動視圖的顯示會通過計算狀态欄導航欄的顯示情況來偏移相應的位置
假如狀态欄顯示,導航欄隐藏向下偏移20,
狀态欄隐藏,導航欄顯示偏移44,兩者都顯示偏移64,都隐藏則不偏移
但是假如我們視圖結構中有一個以上的滾動視圖,我們想自己控制滾動視圖顯示問題,我們就可以設定成NO。這樣所有的滾動視圖将不做顯示偏移
4、modalPresentationCapturesStatusBarAppearance
這個屬性說的是,目前控制器present一個其他控制器上的非全屏界面我們是否接管status bar的外觀,預設是NO,(我們從一個界面A present另一個全屏界面B時,status Bar 的外觀控制被轉交給被B )
假如我們設定成YES,我們可以指定B界面的status bar,即使是非全屏的
這個屬性當present一個全屏界面時是被系統忽略的