終於我還是適配 iOS11 和 iPhone X 了。其實已經適配好幾天了,今天發了版本,把這次在適配中遇到的問題,還是總結下,以備以後的不時之需。如果有做的不好的地方,還請各路大大多多指點。
剛開始什麼都沒動,在 X 上跑,大致跑了下,感覺沒啥問題,高高興興去群裡說我的專案在X上跑一點問題都沒,不需要適配。等我靜下心來,欣賞iPhone X的美時(安安靜靜在模擬器上跑專案),發現事實並不是那麼美好。主要問題有以下幾個:
一、push 和 pop時,頁面偏移
在有UIScrollView或UIScrollView子類(如tableView)的控制器中,push到第二個幾面和pop回去,scrollView都會往下偏移。來上圖
可能已經看到了,有一個向上的偏移效果,看著可別扭。不用擔心,解決辦法是有滴,不過整個工程那麼多UIScrollView及它的子類,每個都去修改是非常搗蛋的,所以我們可以直接在AppDelegate中用UISCrollView的UIAppearance修改,程式碼如下:// AppDelegate 進行全域性設定 不然iOS 11 push時介面會有個下滑的效果,pop回去會有個上劃的效果
if (@available(iOS 11.0, *)){
[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
複製程式碼
OK,完美解決問題。
二、TabBar 在 push 的時候會向上彈,然後還會有黑塊。
解決了第一個問題,緊接著第二個問題又來了,push時,tabBar隱藏,tabBar會往上偏移,並帶有黑塊出現,非常影響視覺,這個不能忍,必須解決,問題看圖:
通過看@臭碼農大大的簡書解決了問題,解決方法是在自定義的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。
簡直了,勾選後就可以了。 ##四、適配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 方法裡進行的。 好了,總的遇到的就這些問題,歡迎交流。
以上參考資料來自@臭碼農的簡書