簡(jiǎn)單描述一下這三個(gè)屬性的含義
- automaticallyAdjustsScrollViewInsets:默認(rèn)為 YES,通常情況下如果在一個(gè)控制器中有且只有一個(gè) ScrollView 或其子類時(shí),滑動(dòng)范圍會(huì)向下移動(dòng) 64px,從而實(shí)現(xiàn)穿透導(dǎo)航欄的效果,該屬性只會(huì)影響到有 ScrollView 或其子類的頁(yè)面。
- Translucent:在 iOS6 或更早的版本,該屬性默認(rèn)為 NO,iOS7 之后默認(rèn)為 YES,主要是設(shè)置導(dǎo)航欄是否具備透明效果,該值設(shè)置后將全局生效。
- topLayoutGuide:這個(gè)屬性是 AutoLayout 中用來輔助布局的,主要用途是來確定 Top 位置。
在之前的項(xiàng)目中,我們都會(huì)在所有控制器的父類中將 Translucent 屬性設(shè)置為 NO,這樣所有的頁(yè)面將全都不具備 ScrollView 的穿透效果,這樣就避免了很多適配版本的麻煩,但蘋果官方默認(rèn)將 automaticallyAdjustsScrollViewInsets 和 Translucent 設(shè)置為 YES 的也是希望 APP 可以具備穿透效果,所以我們就來嘗試使用一下這個(gè)特性。
- 如果在頁(yè)面中并不包含 ScrollView 或其子類時(shí),并不用關(guān)心
automaticallyAdjustsScrollViewInsets 的值,在布局時(shí)應(yīng)該使用
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_topLayoutGuide);
make.left.bottom.right.equalTo(self.view);
}];
這樣就算在更改了 Translucent 的值,頁(yè)面也不會(huì)受到影響。
如果在 **Translucent = YES **時(shí)使用
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view).offset(64);
make.left.bottom.right.equalTo(self.view);
}];
這樣布局在更改為 Translucent = NO 后,頁(yè)面會(huì)整體多位移 64px。
這就是 topLayoutGuide 的作用,可以通過 Translucent 的值自動(dòng)判定 top 的位置。
- 另一種就是包含 ScrollView 或其子類的情況,這種情況下,如果想得到穿透效果,那必須保證 automaticallyAdjustsScrollViewInsets 與 Translucent 均為
YES,但為了保證穿透效果,ScrollView 就要這樣布局,不能再使用 topLayoutGuide 屬性。
[tableview mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.bottom.right.equalTo(self.view);
}];
因?yàn)槿绻O(shè)置了 automaticallyAdjustsScrollViewInsets = YES,系統(tǒng)就會(huì)幫你多位移 64px,以保證不受導(dǎo)航欄的遮擋(tabbar同理)。
但這也要注意,如果有其他頁(yè)面將 Translucent = NO 那么在包含 ScrollView 的頁(yè)面一定要重置 Translucent = YES,這樣才能保證頁(yè)面不會(huì)發(fā)生錯(cuò)位的位移。
總結(jié):
- 通常情況下,普通 View 使用 topLayoutGuide 來設(shè)置 top;
-
ScrollView 則直接
equalTo(self.view),同時(shí)要注意,在需要穿透效果的頁(yè)面保證 automaticallyAdjustsScrollViewInsets 與 Translucent 均為YES。