Xcode 9 GM 已經(jīng)可以下載了 作為 iOS 開發(fā) 豈能不抓緊適配iOS11 以及有齊劉海的 iPhone X 來保住飯碗呢 哈哈哈哈
文章目錄
- 適配 iOS 11
- MJRefreshHeader 漏出馬腳
- TableView 滑不到最底部
- 適配 iOS X
- 啟動圖設(shè)置
- Tabbar 出現(xiàn)透明懸浮
- 出現(xiàn)導航欄不明線條(這個是導航欄高度變化導致的問題)
一 首先來適配 iOS 11


問題一 : 自定義的頭部刷新在自然情況下也會漏出一些馬腳
問題一 分析:
來看一下蘋果的官方 API
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets
API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES
可以看到automaticallyAdjustsScrollViewInsets這個屬性的說明在 iOS11中被廢棄了 要使用contentInsetAdjustmentBehavior這個屬性去代替 所以當ableview的frame超出了安全區(qū)域后系統(tǒng)會自動的調(diào)整SafeAreaInsets的值,而iOS 11中真正影響tableview內(nèi)容與邊緣的變成了adjustedContentInset而不是以前的contentInset。 由于系統(tǒng)對adjustedContentInset進行了調(diào)整導致了tableView的內(nèi)容到邊緣的距離發(fā)生了變化,下移距離分別是20pt(沒有navigationBar,下移了一個statusBar的高度),64pt(navigationBar的高度以及statusBar的高度)。
問題一 解決
代碼實現(xiàn)
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.viewController.automaticallyAdjustsScrollViewInsets = NO;
}
可以簡單粗暴的直接判斷版本已進行適配不同 API 就可以了
contentInsetAdjustmentBehavior 意思是讓adjustContentInset值不受SafeAreaInset值的影響。
至于安全區(qū)域的概念也是 iOS11 剛提出來的 可以參考這篇文章騰訊開放平臺: iOS11適配安全區(qū)域

問題二
可以看到圖片 TableView 滑不到最底部
問題二分析
也是涉及到安全區(qū)域騰訊開放平臺: iOS11適配安全區(qū)域
如果你的APP中使用的是自定義的navigationbar,隱藏掉系統(tǒng)的navigationbar,并且tableView的frame為(0,0,SCREEN_WIDTH, SCREEN_HEIGHT)開始,那么系統(tǒng)會自動調(diào)整SafeAreaInsets值為(20,0,0,0),如果使用了系統(tǒng)的navigationbar,那么SafeAreaInsets值為(64,0,0,0),如果也使用了系統(tǒng)的tabbar,那么SafeAreaInsets值為(64,0,49,0)。
問題二 解決
UIEdgeInsets edges = UIEdgeInsetsMake(0, 0, 64, 0);
tableView.contentInset = edges;
tableView.scrollIndicatorInsets = edges;
二 接著來適配 iPhone X

問題一
APP 的內(nèi)容并沒有充滿整個屏幕
問題一 分析
其實這個問題我們之前可能就碰見過 那就是 如果啟動圖尺寸配置的不正確的話 內(nèi)容都會比屏幕尺寸小
問題一 解決
準備一張尺寸:1125 * 2436的啟動圖片, 移動到LaunchImage的Finder目錄中, 并在LaunchImage中的Contents.json文件中增加 (注意Json格式):
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "圖片名字.png",
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
}

問題二
導航欄出現(xiàn)不明線條
問題二分析
先看一下設(shè)置導航條背景色 的代碼
// 此方法內(nèi)部是返回一個高度為64的 漸進色
UIColor *color = [UIColor colorWithTopColor:WLBHexColor(@"005CCC") bottomColor:WLBHexColor(@"006ADB") height:NAVIGATION_HEIGHT];
self.navigationController.navigationBar.barTintColor = color;
看到代碼應(yīng)該就知道是 NAVIGATION_HEIGHT = 64這個高度的問題了
因為iPhone X的StatusBar高度有所改變
在其他型號的iPhone上StatusBar是20
在iPhone X上StatusBar的高度是44,
所以原本的20(StatusBar)+44(NavBar) = 64 如今變成了如今的44(StatusBar) + 44(NavBar) = 88;
問題二解決方案
// 判斷是否是 iPhone X 的宏
#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
UIColor *color = [UIColor colorWithTopColor:WLBHexColor(@"005CCC") bottomColor:WLBHexColor(@"006ADB") height:iPhoneX ? NAV_BAR_HEIGHT + 24 : NAV_BAR_HEIGHT];
self.navigationController.navigationBar.barTintColor = color;
問題三
tabbar 出現(xiàn)懸浮狀態(tài)
問題三分析
是因為沒有設(shè)置下邊這句代碼導致的
self.tabBar.translucent = NO;
這句表示取消tabBar的透明效果。
蘋果官方文檔解釋:
UINavigationBar/UITabBar的translucent屬性解釋:默認為YES,可以通過設(shè)置NO來強制使用非透明背景,如果導航條使用自定義背景圖片,那么默認情況該屬性的值由圖片的alpha(透明度)決定,如果alpha的透明度小于1.0值為YES。如果手動設(shè)置translucent為YES并且使用自定義不透明圖片,那么會自動設(shè)置系統(tǒng)透明度(小于1.0)在這個圖片上。如果手動設(shè)置translucent為NO并且使用自定義帶透明度(透明度小于0)的圖片,那么系統(tǒng)會展示這張背景圖片,只不過這張圖片會使用事先確定的barTintColor進行不透明處理,若barTintColor為空,則會使用UIBarStyleBlack(黑色)或者UIBarStyleDefault(白色)。
設(shè)置導航欄背景圖片透明度問題如果背景圖片沒有透明度,系統(tǒng)會自動把導航控制器的棧頂控制器的view的Y值增加64,如果沒有透明度,則不會增加。
這一情況的圖片必須是imageSet格式的,并且圖片的透明度為1(不透明),系統(tǒng)才會去調(diào)整。
問題三解決
如問題分析所示
在 UITabbarController 中添加以下代碼
self.tabBar.translucent = NO;