記錄一下 automaticallyAdjustsScrollViewInsets、Translucent和topLayoutGuide 之間的關(guān)系,解決導(dǎo)航欄多位移 64px 的問題

簡(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)將 automaticallyAdjustsScrollViewInsetsTranslucent 設(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 或其子類的情況,這種情況下,如果想得到穿透效果,那必須保證 automaticallyAdjustsScrollViewInsetsTranslucent 均為 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é):

  1. 通常情況下,普通 View 使用 topLayoutGuide 來設(shè)置 top;
  2. ScrollView 則直接 equalTo(self.view),同時(shí)要注意,在需要穿透效果的頁(yè)面保證 automaticallyAdjustsScrollViewInsetsTranslucent 均為 YES。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容