隨著Xcode GM版本發(fā)布,適配iOS 11也就提上了日程,總的來(lái)說(shuō)整個(gè)適配過(guò)程(不包含適配iPhone X)不是很麻煩。
首先建議觀看今年WWDC的一個(gè)視頻Updating Your App for iOS 11,視頻講解了iOS 11一些API的變化,對(duì)理解適配過(guò)程有幫助。
navigation bar
1、導(dǎo)航欄新增了一種大標(biāo)題樣式,默認(rèn)設(shè)置是不開啟,所以不需要修改。
2、titleView支持autolayout,這要求titleView必須是能夠自撐開的或?qū)崿F(xiàn)了- intrinsicContentSize,簡(jiǎn)書的搜索就變成下面這樣了

搜索
解決辦法比較簡(jiǎn)單,這個(gè)搜索框?qū)?yīng)的view實(shí)現(xiàn)- intrinsicContentSize方法
1
2
3-?(CGSize)intrinsicContentSize?{
returnUILayoutFittingExpandedSize;
}
安全區(qū)域適配
iOS 11中ViewController的automaticallyAdjustsScrollViewInsets屬性被廢棄了,導(dǎo)致了這兩個(gè)頁(yè)面出現(xiàn)了問(wèn)題


這兩個(gè)頁(yè)面都隱藏了系統(tǒng)導(dǎo)航欄,自定義導(dǎo)航欄。
1
2
3self.automaticallyAdjustsScrollViewInsets?=?NO;
self.extendedLayoutIncludesOpaqueBars?=?YES;
self.edgesForExtendedLayout?=?UIRectEdgeTop;
automaticallyAdjustsScrollViewInsets屬性被廢棄了,頂部就多了一定的inset,關(guān)于安全區(qū)域適配,簡(jiǎn)書上的這篇文章iOS 11 安全區(qū)域適配總結(jié)介紹得非常詳細(xì),請(qǐng)參考這篇文章。
我們采用了比較簡(jiǎn)單的方法
1
2
3
4
5if(@available(iOS11.0,?*))?{
self.tableView.contentInsetAdjustmentBehavior?=?UIScrollViewContentInsetAdjustmentNever;
}else{
self.automaticallyAdjustsScrollViewInsets?=?NO;
}
導(dǎo)航欄返回按鈕

之前的代碼通過(guò)下面的方式自定義返回按鈕
1
2
3
4
5
6
7UIImage?*backButtonImage?=?[[UIImage?imageNamed:@"icon_tabbar_back"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0,18,0,0)];
[[UIBarButtonItem?appearance]?setBackButtonBackgroundImage:backButtonImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem?appearance]?setBackButtonTitlePositionAdjustment:UIOffsetMake(0,?-60)
forBarMetrics:UIBarMetricsDefault];
iOS 11 中setBackButtonTitlePositionAdjustment:UIOffsetMake沒(méi)法把按鈕移出navigation bar。
解決方法是設(shè)置navigationController的backIndicatorImage和backIndicatorTransitionMaskImage
1
2
3UIImage?*backButtonImage?=?[[UIImage?imageNamed:@"icon_tabbar_back"]?imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationBar.backIndicatorImage?=?backButtonImage;
self.navigationBar.backIndicatorTransitionMaskImage?=?backButtonImage;
tableview問(wèn)題

右邊為正確樣式
iOS
11中如果不實(shí)現(xiàn)-tableView: viewForFooterInSection: 和 -tableView:
viewForHeaderInSection:,那么-tableView: heightForHeaderInSection:和-
tableView: heightForFooterInSection:不會(huì)被調(diào)用。
這是因?yàn)閑stimatedRowHeight
estimatedSectionHeaderHeight
estimatedSectionFooterHeight三個(gè)高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension,導(dǎo)致高度計(jì)算不對(duì),解決方法是實(shí)現(xiàn)對(duì)應(yīng)方法或吧這三個(gè)屬性設(shè)為0。
下面這個(gè)列表顯示不全也是estimatedRowHeight引起,取contentSize出錯(cuò)。

第三方依賴庫(kù)問(wèn)題
1、ReactiveCocoa Unknown warning group ‘-Wreceiver-is-weak’,ignored警告

ReactiveCocoa
簡(jiǎn)書項(xiàng)目開啟Treat warning as error,所有警告都會(huì)被當(dāng)成錯(cuò)誤,因此必須解決掉。
RACObserve宏定義如下:
1
2
3
4
5
6
7
8#define?RACObserve(TARGET,?KEYPATH)?\
({?\
_Pragma("clang?diagnostic?push")?\
_Pragma("clang?diagnostic?ignored?\"-Wreceiver-is-weak\"")?\
__weak?id?target_?=?(TARGET);?\
[target_?rac_valuesForKeyPath:@keypath(TARGET,?KEYPATH)?observer:self];?\
_Pragma("clang?diagnostic?pop")?\
})
在之前的Xcode中如果消息接受者是一個(gè)weak對(duì)象,clang編譯器會(huì)報(bào)receiver-is-weak警告,所以加了這段push&pop,最新的clang已經(jīng)把這個(gè)警告給移除,所以沒(méi)必要加push&pop了。
ReactiveCocoa已經(jīng)不再維護(hù)OC版本,大多數(shù)OC開發(fā)者用的都是2.5這個(gè)版本,只能自己fork一份了,誰(shuí)知github上的v2.5代碼不包含對(duì)應(yīng)的.podspec文件,只好到CocoaPods/Specs上將對(duì)應(yīng)的json文件翻譯成.podspec文件,如果你也有這個(gè)需要,可以修改Podfile如
1
pod'ReactiveCocoa',?:git?=>'https://github.com/zhao0/ReactiveCocoa.git',?:tag?=>'2.5.2'
2、MGSwipeTableCell 崩潰

左滑cell
MGSwipeTableCell用于實(shí)現(xiàn)左滑菜單,在iOS 11上出現(xiàn)了崩潰,github上新版修復(fù)了,升級(jí)即可
最后,感謝我女朋友在我寫這篇文章的時(shí)候喂我吃水果。
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。