automaticallyAdjustsScrollViewInsets和edgesForExtendedLayout和extendedLayoutIncludesOpaqueBars

將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的下方




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章