開發日常 適配iOS11和iPhone X

TongRy發表於2017-12-13

iPhone X.png

終於我還是適配 iOS11 和 iPhone X 了。其實已經適配好幾天了,今天發了版本,把這次在適配中遇到的問題,還是總結下,以備以後的不時之需。如果有做的不好的地方,還請各路大大多多指點。

剛開始什麼都沒動,在 X 上跑,大致跑了下,感覺沒啥問題,高高興興去群裡說我的專案在X上跑一點問題都沒,不需要適配。等我靜下心來,欣賞iPhone X的美時(安安靜靜在模擬器上跑專案),發現事實並不是那麼美好。主要問題有以下幾個:

一、push 和 pop時,頁面偏移

在有UIScrollView或UIScrollView子類(如tableView)的控制器中,push到第二個幾面和pop回去,scrollView都會往下偏移。來上圖

頁面偏移.gif
可能已經看到了,有一個向上的偏移效果,看著可別扭。不用擔心,解決辦法是有滴,不過整個工程那麼多UIScrollView及它的子類,每個都去修改是非常搗蛋的,所以我們可以直接在AppDelegate中用UISCrollView的UIAppearance修改,程式碼如下:

// AppDelegate 進行全域性設定 不然iOS 11 push時介面會有個下滑的效果,pop回去會有個上劃的效果
if (@available(iOS 11.0, *)){
        [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
複製程式碼

OK,完美解決問題。

二、TabBar 在 push 的時候會向上彈,然後還會有黑塊。

解決了第一個問題,緊接著第二個問題又來了,push時,tabBar隱藏,tabBar會往上偏移,並帶有黑塊出現,非常影響視覺,這個不能忍,必須解決,問題看圖:

tabBar上移.gif
通過看@臭碼農大大的簡書解決了問題,解決方法是在自定義的navigationController中重寫的push方法裡面修改tabbar的frame,程式碼如下:

    // 修改tabBar的frame 不然iPhone X push的時候tabBar上會向上彈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (self.viewControllers.count > 0) {
           viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
    CGRect frame = self.tabBarController.tabBar.frame;
    frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
    self.tabBarController.tabBar.frame = frame;
}
複製程式碼

##三、tableView cell自動計算高度失效了。 這個問題是突然在一個頁面發現的,不知道為啥,突然自定義的cell自動計算高度無效了,執行起來一堆亂佈局,當時可把我急壞了,到處找問題,還跑到Xcode8.3中去找問題,都沒解決。self.tableView.estimatedRowHeight設定了也沒用,後來無意間發現了個東西,簡直像發現了新大陸一樣,在Xcode9中在xib中設定的tableView需要勾選是否Automatic。

image.png
簡直了,勾選後就可以了。 ##四、適配iPhone X,針對底部有按鈕或者頂部有按鈕的情況。 iPhone X出來後,多了個劉海和下面的觸發互動行為的按鈕,蘋果官方要求,這兩個區域是非安全區域,不能有功能性按鈕,當我們有功能性按鈕是,需要放在安全區裡面的。所以當我們底部或者頂部有自定義的View時,需要放在安全區域內。 頂部我們可以這樣:

// 適配iPhone X
    if (@available(iOS 11.0, *)){
        self.navView.frame = CGRectMake(0, self.view.safeAreaInsets.top, self.view.width, 64);
    } else {
        [self.navView mas_updateConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.mas_topLayoutGuide);
        }];
    }
     // 重新設定navView下方的view的frame
    CGRect frame = self.webView.frame;
    frame.origin.y = CGRectGetMaxY(self.navView.frame);
    self.webView.frame = frame;
複製程式碼

底部:

// 適配iPhone X
    if (@available(iOS 11.0, *)){
        self.confirmBtn.frame = CGRectMake(0, self.view.height - self.view.safeAreaInsets.bottom - 48, self.view.width, 48);
    } else {
        [self.confirmBtn mas_updateConstraints:^(MASConstraintMaker *make) {
            make.bottom.equalTo(self.mas_bottomLayoutGuide);
        }];
    }
    // 重新給confirmBtn上方的View設定frame
    CGRect frame = self.tableView.frame;
    frame.size.height = self.confirmBtn.frame.origin.y;
    self.tableView.frame = frame;
複製程式碼

當然了這兩個設定都是放在 viewDidLayoutSubviews 方法裡進行的。 好了,總的遇到的就這些問題,歡迎交流。

以上參考資料來自@臭碼農的簡書

適配iPhone X Push過程中TabBar位置上移 10分鐘適配 iOS 11 & iPhone X

相關文章