
iPhone X上市了,給設計師和開發(fā)工程師們又帶了新的挑戰(zhàn),那一條齊劉海和四個圓角的屏幕,不得不去進行屏幕適配,并且蘋果的iOS11也進行了一些方法的替換,這就讓以前寫的代碼在iOS11的系統(tǒng)上跑起來有了不小挑戰(zhàn)。
首先先說一下安全區(qū)

以往的其他iPhone屏幕都是長方形的,所以里面的顯示區(qū)域不會存在遮擋的現(xiàn)象。iPhone X由于全面屏的設計,在屏幕的上方,下方都變成了弧形的,而控件都還是長方形,所以就會出現(xiàn)顯示不全的情況。
為了解決遮擋的問題,所在在設計的時候就要避開這個區(qū)域,所以實際的iPhone X的安全區(qū)域就是圖上所畫的綠色的區(qū)域,而白色的區(qū)域,蘋果會根據(jù)上下的顏色而自動填充。

在其他iPhone上狀態(tài)欄的高度為20個像素,而在iPhone X上狀態(tài)欄的高度變?yōu)榱?8個像素,并且在底部多出了48個像素。
當我們打印iPhone X的屏幕尺寸時[UIScreen mainScreen].bounds.size 打印值為375x812注意這個812是算上安全區(qū)域的大小
好了知道這些,我就就知道怎么去適配屏幕了
1.一個界面一般都會有UITableView、UIScrollView、UICollectionView,并且一般會把這些作為底部視圖
這種情況下設置視圖大小的時候個人建議直接使用self.view.bounds就可以了。
像iOS11中已經(jīng)廢除了automaticallyAdjustsScrollViewInsets這個方法,所以需要進行版本判斷
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
2.如果要拿出狀態(tài)欄的高度可以使用一個宏
// 屏幕寬高
#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kScreenH [UIScreen mainScreen].bounds.size.height
// iPhone X 宏定義
#define iPhoneX (kScreenW == 375.f && kScreenH == 812.f ? YES : NO)
// 適配iPhone X 狀態(tài)欄高度
#define CF_StatusBarHeight (iPhoneX ? 44.f : 20.f)
3.如果要拿出導航欄的高度可以使用一個宏
// 適配iPhone X 導航欄高度
#define CF_NavHeight (iPhoneX ? 88.f : 64.f)
4.如果要拿出Tabbar的高度可以使用一個宏
// 適配iPhone X Tabbar距離底部的距離
#define CF_TabbarSafeBottomMargin (iPhoneX ? 34.f : 0.f)
// 適配iPhone X Tabbar高度
#define CF_TabbarHeight (iPhoneX ? (49.f+34.f) : 49.f)
iOS 11中如果不實現(xiàn)-tableView: viewForFooterInSection:和 -tableView: viewForHeaderInSection:,那么-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會被調用。
這是因為estimatedRowHeight estimatedSectionHeaderHeight estimatedSectionFooterHeight三個高度估算屬性由默認的0變成了UITableViewAutomaticDimension,導致高度計算不對,解決方法是實現(xiàn)對應方法或吧這三個屬性設為0。
在使用圖片方面
4.7‘’及以下的設備目前使用的圖片全是@2x
plus系列和iPhone X使用的圖片是@3x