將automaticallyAdjustsScrollViewInsets和edgesForExtendedLayout和extendedLayoutIncludesOpaqueBars三個放在一起來看,因爲三者之間會有一定的相互影響
1.edgesForExtendedLayout
typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
UIRectEdgeNone = 0, // 沒有延伸效果
UIRectEdgeTop = 1 << 0, // 上部延伸
UIRectEdgeLeft = 1 << 1, // 左延伸
UIRectEdgeBottom = 1 << 2, // 底部延伸
UIRectEdgeRight = 1 << 3, // 右延伸
UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight // 四個方向都延伸
@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout
UIViewController 的這個屬性從名字上來看,就可以得到一些有用的信息:
edgesForExtendedLayout 邊緣延伸佈局。
也就是說視圖佈局的時候是否延伸?爲什麼說延伸或者爲什麼會延伸呢?
比如:導航控制器,在導航控制器下的控制器情況下,視圖的顯示區域是屏幕上方就開始計算座標了,其實就是邊緣延伸到了上方,也即是UIRectEdgeTop導致的效果
最直接影響的就是self.view。在延伸的情況下self.view 的高度爲 屏幕高度減去 64
例如:
<span style="font-size:14px;">UIView * view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];</span>
這樣添加一個view之後,紅色的區域從狀態欄就開始了,也就是延伸到了導航的下面
打印self.view.frame 爲
<span style="font-size:14px;">{{0, 64}, {320, 568}}</span>
現在把edgesForExtendedLayout設置爲UIRectEdgeNone ,可以看到已經在導航的下面
打印self.view.frame 爲
<span style="font-size:14px;">{{0, 64}, {320, 504}}</span>
同樣其它UIRectEdgeLeft,UIRectEdgeRight,UIRectEdgeBottom 這是這樣的原理。
其實對於edgesForExtendedLayout 這個屬性還是很漂亮的,在導航半透明的情況下,一些模糊的效果還是挺好看的。例如微信的導航就是半透明。
2.automaticallyAdjustsScrollViewInsets //自動調整scrollView的縮進
顧名思義就是是否自動調整scrolloView的縮進
如:iPhone手機的短信軟件的短息列表,當我們滑動的時候,信息內容會滑動到導航的下面。
下面看一下這個屬性的影響。
如上圖scrolloView距離頂部爲0,scrolloVIew 的背景色爲CyanColor;
下面讓其被Push出來,看一下效果
可以看到scrolloView 在屏幕頂端就開始顯示,但是他的內容卻被自動縮進到了導航欄的下方。這是系統自動爲scrolloView縮進了64個單位。
現在設置self.automaticallyAdjustsScrollViewInsets 爲NO.
效果如圖:
很明顯scrolloView 並沒有被縮進,全部現在了導航欄的下方。。。
到這裏差不多也能看到automaticallyAdjustsScrollViewInsets的真正作用了。
但是還是有幾個注意點的
【注意】:
1.當我們設置edgesForExtendedLayout 爲UIRectEdgeNone 的時候,automaticallyAdjustsScrollViewInsets 這個無論怎麼設置都不會產生影響了。
2.automaticallyAdjustsScrollViewInsets在非導航或TabBar 等特殊控件影響下,也是沒有作用的
3.在導航控制器或TabBar控制器下,無論scrolloView 在什麼位置都會被自動產生縮進。這點是非常不好的。所以寫代碼的時候要注意一下。可以將當前控制器的automaticallyAdjustsScrollViewInsets設置爲NO,消除影響。
3.extendedLayoutIncludesOpaqueBars
@property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars NS_AVAILABLE_IOS(7_0); // Defaults to NO, but bars are translucent by default on 7_0.
顧名思義就是,擴展布局是否包括半透明的Bars(NavigatinBar,TabBar)。默認的爲NO;
蘋果這樣做是很人性化的,如果bars不是半透明的情況下,再使延伸佈局到bars的下方,這樣感覺是毫無意義的,所以在bars不爲半透明的情況下,默認不會延伸佈局。
當然我們可以設置self.navigationController.navigationBar.translucent = NO; 取消導航的半透明效果。結果如下:
打印self.view.frame 結果如下:
{{0, 64}, {320, 504}}。
其實就是等同的設置了
self.edgesForExtendedLayout = UIRectEdgeNone;
【注意】
如果還存在TabBar的情況下,並且TabBar爲半透明,同樣還會延伸到TabBar的下方