前言:
9月20日,Xcode 9正式上線了,終于可以揭開iPhone X的神秘面紗了,好奇夾雜著興奮的同時,依然帶有可能被坑的不安。
適配iOS 11
1.Xcode 9有些編譯報錯
作者碰到編譯錯誤的庫有RealReachability。在Apple的這個網(wǎng)絡(luò)監(jiān)聽庫中,/Ping/PingFoundation.h中有使用編譯時態(tài)的語法,然后提示錯誤。解決方法既可以替換最新的庫,也可以將代碼改成一下。

可能讀者你的項目還有別的錯誤,針對不同問題,可以去網(wǎng)上找相對應(yīng)的錯誤的解決方法,也可以去及時替換第三方庫,作者就不再此一一列舉了。
2.屏幕尺寸不對,iPhone X為何屏幕尺寸還停留在375*667下?
問題描述: iPhone X的屏幕尺寸是375pt×812pt @3x,所以需要新給1125 * 2436。顯示效果如下圖

可以看出顯示的區(qū)域并不是375*812,而從打印的日志
NSLog(@"current bounds:%@",NSStringFromCGRect([UIScreen mainScreen].bounds));也是
當(dāng)前的view frame:{{0, 0}, {375, 667}},所以iPhone X并沒有獲取正確的屏幕尺寸。問題解決:其實(shí),這個問題之前也遇到過。很多項目在配置LaunchImage時,使用的是Assets,如下圖。

而iPhone X的屏幕尺寸是375pt×812pt @3x,所以需要在Assets里將LaunchImage進(jìn)行修改。將原有的LaunchImage.Assets刪了重新 創(chuàng)建帶iPhone X的Landscape,并且圖片尺寸為375×3 * 812×3即可。
3.iPhone X的狀態(tài)欄變成了44點(diǎn)了
4.關(guān)于iOS 11的適配
(1)UITableViewStyleGrouped類型的UITableView頂部留白問題
原因:在于代碼只實(shí)現(xiàn)了heightForHeaderInSection方法而沒有實(shí)現(xiàn)viewForHeaderInSection方法。只實(shí)現(xiàn)高度沒實(shí)現(xiàn)view在iOS11之前沒有問題,而iOS11之后由于開啟了估算行高機(jī)制引起的bug。
解決方式:
第一種方式:添加viewForHeaderInSection方法即可解決。
第二種方式:
self.tableView.estimatedSectionHeaderHeight = 16; //該值根據(jù)自己項目進(jìn)行設(shè)置
self.tableView.estimatedSectionFooterHeight = 0.1;
(2)iOS11下APP中tableView內(nèi)容下移20pt或者64pt
原因:iOS11中的Controller的automaticallyAdjustsScrollViewInsets屬性被廢棄了,所以當(dāng)tableView超過安全區(qū)域時,系統(tǒng)自動調(diào)整了SafeAreaInsets值,進(jìn)而影響adjustedContentInset屬性,而不是contentInset。所以adjustedContentInset值調(diào)整,導(dǎo)致tableView下移了20pt或者64pt。(自己在調(diào)試的時候可以打印,如下代碼)
NSLog(@"safe area insets:%@",NSStringFromUIEdgeInsets(self.scrollView.safeAreaInsets));//注意打印該句話,需要在scrollView已經(jīng)創(chuàng)建完成打印,如在viewWillDisappear:中打印,剛創(chuàng)建的時候是默認(rèn)UIEdgeInsetsZero值的
解決方式:
第一種解決方式:重新設(shè)置scrollView的contentInset值,來抵消SafeAreaInset值
第二種解決方式:設(shè)置scrollView的contentInsetAdjustmentBehavior值,如下代碼
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIApplicationBackgroundFetchIntervalNever;
}
第三種解決方式:通過新增屬性addtionalSafeAreaInset。
iOS 11之前,大家是通過將Controller的automaticallyAdjustsScrollViewInsets屬性設(shè)置為NO,來禁止系統(tǒng)對tableView調(diào)整contentInsets的。如果還是想從Controller級別解決問題,那么可以通過設(shè)置Controller的additionalSafeAreaInsets屬性,如果SafeAreaInset值為(20,0,0,0),那么設(shè)置additionalSafeAreaInsets屬性值為(-20,0,0,0),則SafeAreaInsets不會對adjustedContentInset值產(chǎn)生影響,tableView內(nèi)容不會顯示異常。這里需要注意的是addtionalSafeAreaInset是Controller的屬性,要知道SafeAreaInset的值是由哪個Controller引起的,可能是由自己的Controller調(diào)整的,可能是navigationController調(diào)整的。是由哪個Controller調(diào)整的,則設(shè)置哪個Controller的addtionalSafeAreaInset值來抵消掉SafeAreaInset值
注:參考iOS 11 安全區(qū)域適配總結(jié)
快速解決方式
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
if (@available(iOS 11.0, *)) {
UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
UITableView.appearance.estimatedRowHeight = 0;
UITableView.appearance.estimatedSectionFooterHeight = 0;
UITableView.appearance.estimatedSectionHeaderHeight = 0;
} else {
// Fallback on earlier versions
}
//....
}
(3)iOS11相冊權(quán)限變更
iOS11之后:默認(rèn)開啟訪問相冊權(quán)限(讀權(quán)限),無需用戶授權(quán),無需添加NSPhotoLibraryUsageDescription,適配iOS11之前的還是需要加的。添加圖片到相冊(寫權(quán)限),需要用戶授權(quán),需要添加 NSPhotoLibraryAddUsageDescription
在談?wù)刋code 9的一些新的別的功能
Xcode 9的無線調(diào)試
前提要求:①Xcode 9 ②真機(jī)設(shè)備iOS 11 ③mac和真機(jī)同處一個wifi環(huán)境
第一步:還是要用線??先連接,打開Windows->Device and Simulators,選擇你要的真機(jī)。

第二步:你的設(shè)備右側(cè)會出現(xiàn)一個球狀標(biāo)識, 到此你就可以拔掉數(shù)據(jù)線, 開始無效調(diào)試咯
