先來看一下三款新的iPhoneXS的相關尺寸吧, 如下 :

需要注意的是:
iPhoneXS和iPhoneX的相關尺寸相同,所以,iPhone XS和iPhoneX一樣,無需做其他適配;
iPhoneX、iPhone XS、iPhone XS Max均為3倍屏,但是iPhoneXR為2倍屏
如果你使用的是LaunchImag,就需要提供正確的啟動圖。需要注意的是XR使用的@2x的圖
如果我們只設置iPhone X的啟動圖,沒有設置iPhone XR/iPhone XS Max啟動圖。iPhone XR/iPhone XS Max會默認使用iPhone X的啟動圖
iPhoneXS Max以及iPhoneXR的邏輯像素是一致的,均為414*896pt,區(qū)別在于一個是@3x,一個是@2x
針對這種樣式的屏幕,我們處理方法是一樣,幾個宏直接搞定
怎么判斷是不是iPhone X? 獲取當前屏幕寬度或高度與尺寸進行比較就可以了

由上圖不難看出, 我們在設計的時候以iPhone8(375*667pt)為基準做設計稿,先得到iPhoneXR:由于都是@2x,首先需要將畫板寬度拉寬為414pt,高度拉高為896pt(與我們做iPhone5到iPhone6的寬高變化處理是一樣的道理),狀態(tài)欄由20pt變高為44pt,在底部加上主頁指示器(Home Indicator)高度為34pt,導航欄以及標簽欄高度不變。我們發(fā)現(xiàn)iPhoneXR內容呈現(xiàn)的比iPhone8要多一些。有了iPhoneXR后,直接等比例放大1.5倍就可以得到iPhoneXS Max
即:導航欄依舊是64->88, 底部的UITabBar由49->83
附上幾個宏, 直接解決:
'#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO) '
'#define iPhoneXR ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size) : NO) '
'#define iPhoneXS_Max ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) : NO)'
/**
- 屏幕適配--iPhoneX全系
*/
'#define kiPhoneXAll ([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)'
/**
- iPhoneX全系導航欄增加高度 (64->88)
*/
'#define kiPhoneX_Top_Height (([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)?24:0)'
/**
- iPhoneX全系TabBar增加高度 (49->83)
*/
'#define kiPhoneX_Bottom_Height (([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)?34:0)'
注意的是:針對繼承自UIScrollView的,需要處理一下內邊距
//第一步:關閉自動調整內邊距
if (@available(iOS 11.0, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
//第二步:在使用的地方手動設置內邊距
self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, kBottomBarHeight, 0);
//這樣設置以后,底下的觸摸區(qū)域就能正常顯示內容了,而且當UIScrollView滑到最底部的時候,不會被遮住。