iOS11, Xcode9 and iphone X適配

前言

最近公司的很多流量產(chǎn)品需要適配iOS 11 和iPhone X鸭津,由于公司的iPhone X到的比較晚扯罐,拖了好久才對(duì)這些流量產(chǎn)品進(jìn)行更新滋捶。

問題

  1. 首先一個(gè)很明顯的適配問題市咽,就是打開app的時(shí)候沒有全屏偷仿,這時(shí)候要加入一張對(duì)應(yīng)尺寸的啟動(dòng)圖片就可以鸵赫。
  • 豎屏尺寸:1125px × 2436px(375pt × 812pt @3x)
  • 橫屏尺寸:2436px × 1125px(812pt × 375pt @3x)
  1. 跟啟動(dòng)屏有關(guān)的當(dāng)然還有一個(gè)問題衣屏,那就是獲取屏幕的大小:[[UIScreen mainScreen] bounds].size 加入上面的圖片就可以了

導(dǎo)航欄

  1. navigationItem.titleView = 自定義view, 這時(shí)候這個(gè)自定義的view的大小就會(huì)出現(xiàn)問題奉瘤,而且有點(diǎn)擊時(shí)間也不會(huì)觸發(fā)勾拉。首先煮甥,在自定義titleview 里重寫 intrinsicContentSize 屬性,代碼如下

    @property(nonatomic, assign) CGSize intrinsicContentSize;
    

然后在 self.navigationItem.titleView = _titleView; 之前加入下面的代碼:

_titleView.intrinsicContentSize = CGSizeMake(200, 40);

自定義的view還是要設(shè)置frame藕赞,不然不是iOS11還是可能出問題成肘。

  1. 導(dǎo)航欄高度的變化

iOS11之前導(dǎo)航欄默認(rèn)高度為64pt(這里高度指statusBar + NavigationBar),iOS11之后如果設(shè)置了prefersLargeTitles = YES則為96pt斧蜕,默認(rèn)情況下還是64pt双霍,但在iPhoneX上由于劉海的出現(xiàn)statusBar由以前的20pt變成了44pt,所以iPhoneX上高度變?yōu)?8pt批销,由于劉海多出了24pt的高度洒闸,如果項(xiàng)目里隱藏了導(dǎo)航欄加了自定義按鈕之類的,這里需要注意適配一下均芽。

968977-89a88f618da51832.png

968977-b19a09df0a51bf50.png

viewSafeAreaInsetsDidChange方法里面打印NSLog(@"%@",NSStringFromUIEdgeInsets(self.view.safeAreaInsets));即可知道安全區(qū)域的邊界

  1. 在iOS7之后,我們?cè)谠O(shè)置UINavigationItemleftBarButtonItem,rightBarButtonItem的時(shí)候都會(huì)造成位置的偏移,我們經(jīng)常習(xí)慣使用下面這個(gè)方法來調(diào)整下間距

    +(UIBarButtonItem *)fixedSpaceWithWidth:(CGFloat)width {`
     UIBarButtonItem *fixedSpace = [[UIBarButtonItem         alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
     fixedSpace.width = width;
     return fixedSpace;
     }
    

但是在iOS11沒有效果了丘逸,可以通過過改變按鈕的 contentEdgeInsetsimageEdgeInsets的值成功改變了按鈕的偏移問題,單獨(dú)設(shè)置contentEdgeInsets也可達(dá)到一定的效果

底部tarbar

  1. iPhone x:Tabbar從49pt變?yōu)?3pt掀宋,如果是自己定義的tabbar需要自己加上34的高度深纲,否則會(huì)點(diǎn)不到對(duì)應(yīng)tabbar。如果是隱藏的tabbar的話劲妙,比如底部放了一個(gè)banner廣告的話湃鹊,這時(shí)候也需要調(diào)整對(duì)應(yīng)的高度,在xcode中調(diào)整了下如果隱藏tabbar镣奋,還要在底部放廣告的話可以距離底部24pt币呵,蘋果tabbar多加了34,比點(diǎn)擊距離多加了10pt侨颈,應(yīng)該是讓用戶體驗(yàn)更加的好點(diǎn)余赢,不然24的話感覺快點(diǎn)到底部觸摸欄的樣子。

UITableView and UICollectionView

  1. 在iOS 11上運(yùn)行tableView向下偏移64px或者20px哈垢,因?yàn)閕OS 11廢棄了automaticallyAdjustsScrollViewInsets没佑,而是給UIScrollView增加了contentInsetAdjustmentBehavior屬性。避免這個(gè)坑的方法是要判斷

       if (@available(iOS 11.0, *)) {
         _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
       }else {
         self.automaticallyAdjustsScrollViewInsets = NO;
       }
    
  2. IOS11以后温赔,Self-Sizing默認(rèn)開啟,包括Headers, footers鬼癣。如果項(xiàng)目中沒使用estimatedRowHeight屬性陶贼,在IOS11下會(huì)有奇奇怪怪的現(xiàn)象,默認(rèn)如果不去實(shí)現(xiàn)viewForHeaderInSection就不會(huì)調(diào)用heightForHeaderInSection,尾部試圖一樣待秃,因?yàn)镮OS11之前拜秧,estimatedRowHeight默認(rèn)為0,Self-Sizing自動(dòng)打開后章郁,contentSizecontentOffset都可能發(fā)生改變枉氮≈狙埽可以通過以下方式禁用:

     self.tableView.estimatedRowHeight = 0; 
     self.tableView.estimatedSectionHeaderHeight = 0; 
     self.tableView.estimatedSectionFooterHeight = 0;
    
  3. 列表/頁面偏移,設(shè)置工程中的UITableView聊替、UICollectionView楼肪、UIScrollView的contentInsetAdjustmentBehavior屬性,如下:

       if (@available(iOS 11.0, *)){
         _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
      }
    

總的來說所有繼承與Scrollview 及其子類都需要設(shè)置 contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever 惹悄,每個(gè)設(shè)置很麻煩春叫,沒關(guān)系。由于UIView及其子類都遵循UIAppearance協(xié)議泣港,我們可以進(jìn)行全局配置:

// AppDelegate 進(jìn)行全局設(shè)置
if (@available(iOS 11.0, *)){
    [[UIScrollView appearance]     setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
  1. 當(dāng)你在tableView 里面嵌套collectionView 的時(shí)候有可能出現(xiàn)一下錯(cuò)誤:

     Assertion failure in -[UICollectionViewData validateLayoutInRect:],              /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3694.4.18/UICollectionViewData.m:435
     2017-11-15 15:59:08.616969+0800 tbEmojiGuangchang[70423:3415148] invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
    

    libc++abi.dylib: terminate_handler unexpectedly threw an exception

只要在刷新collectionView之前調(diào)用[collectionView.collectionViewLayout invalidateLayout] 就行暂殖。

  -(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
      [collectionView.collectionViewLayout invalidateLayout];
      return 1;
  }
  1. 相冊(cè)權(quán)限
    iOS11之后:默認(rèn)開啟訪問相冊(cè)權(quán)限(讀權(quán)限),無需用戶授權(quán)当纱,無需添加NSPhotoLibraryUsageDescription呛每,適配iOS11之前的還是需要加的。 添加圖片到相冊(cè)(寫權(quán)限)坡氯,需要用戶授權(quán)晨横,需要添加 NSPhotoLibraryAddUsageDescription,相冊(cè)的權(quán)限狀態(tài)有以下四種狀態(tài):

     PHAuthorizationStatusNotDetermined = 0, // User has not yet made a choice with regards to this application
     PHAuthorizationStatusRestricted,        // This application is not authorized to access photo data.
                                        // The user cannot change this application’s status, possibly due to active restrictions
                                        //   such as parental controls being in place.
    PHAuthorizationStatusDenied,            // User has explicitly denied this application access to photos data.
    PHAuthorizationStatusAuthorized         // User has authorized this application to access photos data.
    

iOS11之前如果還沒請(qǐng)求訪問相冊(cè)權(quán)限的話狀態(tài)是:PHAuthorizationStatusNotDetermined ,用戶如果點(diǎn)擊不允許訪問相冊(cè)的話狀態(tài)是:PHAuthorizationStatusDenied ,但是在iOS11就很奇葩,還沒請(qǐng)求訪問相冊(cè)權(quán)限和用戶如果點(diǎn)擊不允許訪問相冊(cè)的狀態(tài)都是PHAuthorizationStatusNotDetermined廉沮,導(dǎo)致不能判斷是否是用戶點(diǎn)擊不允許的操作颓遏,也就沒辦法彈出那個(gè)引導(dǎo)用戶去設(shè)置開啟相冊(cè)權(quán)限的窗口。我這邊的做法是如果應(yīng)用是有需要添加相片到相冊(cè)的滞时,要提前請(qǐng)求相冊(cè)功能:

oc 代碼:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    
}];

swift 代碼:

if #available(iOS 11.0, *) {
        let library: PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        if(library == PHAuthorizationStatus.notDetermined){
            PHPhotoLibrary.requestAuthorization { (status) in
            }
        }
 }
  1. 位置權(quán)限

在IOS11叁幢,原有的NSLocationAlwaysUsageDeion被降級(jí)為NSLocationWhenInUseUsageDeion。因此坪稽,在原來項(xiàng)目中使用requestAlwaysAuthorization獲取定位權(quán)限曼玩,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系統(tǒng)框不會(huì)彈出窒百。建議新舊key值都在plist里配置黍判,反正我試下來是沒有問題,唯一的區(qū)別是使用requestAlwaysAuthorization獲取權(quán)限 IOS11系統(tǒng)彈框會(huì)把幾種權(quán)限級(jí)別全部列出篙梢,供用戶選擇顷帖,顯然更人性化了〔持停快去更新你的info.plist

 <!-- 位置 -->
<key>NSLocationUsageDescription</key>
<string>獲取地理位置贬墩,精準(zhǔn)推送服務(wù)</string>
<!-- 在使用期間訪問位置 -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>獲取地理位置,精準(zhǔn)推送服務(wù)</string>
<!-- 始終訪問位置 -->
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始終訪問位置</string>
<!-- iOS 11訪問位置 -->
<key>NSLocationAlwaysAndWhenInUseUsageDeion</key>
<string>App需要您的同意,才能始終訪問位置</string>
  1. 使用第三方網(wǎng)絡(luò)監(jiān)測(cè)庫報(bào)錯(cuò)


    325120-0850ff880b326807.png

解決方式如下:替換成如下代碼:

__Check_Compile_Time(sizeof(ICMPHeader) == 8);
__Check_Compile_Time(offsetof(ICMPHeader, type) == 0);
__Check_Compile_Time(offsetof(ICMPHeader, code) == 1);
__Check_Compile_Time(offsetof(ICMPHeader, checksum) == 2);
__Check_Compile_Time(offsetof(ICMPHeader, identifier) == 4);
__Check_Compile_Time(offsetof(ICMPHeader, sequenceNumber) == 6)

后續(xù)更新...

  1. 跳轉(zhuǎn)appStore評(píng)論的鏈接更換了妄呕,很正常陶舞,因?yàn)閕OS11之后appStore就大改版了,當(dāng)然跳到里面的鏈接應(yīng)該也是會(huì)有所變化的绪励,之前iOS11的鏈接是這樣的:

    http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=XXXXXXXX&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8"
    

iOS11之后需要改稱以下這樣肿孵,當(dāng)然iOS11之前這個(gè)鏈接也是適用的:

itms-apps://itunes.apple.com/cn/app/idXXXXXX?mt=8&action=write-review
  1. UIToolBar 的坑唠粥,當(dāng)你使用view集成UIToolBar的時(shí)候停做,這個(gè)時(shí)候使用xcode9運(yùn)行的時(shí)候會(huì)發(fā)現(xiàn)一個(gè)非澄罾ⅲ坑的問題,就是在view的最頂層會(huì)多出一層UIToolBarContenVIew出來雅宾,到時(shí)你的整個(gè)view沒辦法點(diǎn)擊养涮,建議不要用UIToolbar來繼承。


    CA99B4BE-B322-453E-951E-A0B5B32E4530.png

總結(jié)

以上是我在適配我的一些產(chǎn)品的時(shí)候碰到的一些問題眉抬,當(dāng)然還有一些其他很小的細(xì)節(jié)有問題贯吓,只需要稍微調(diào)整就行,在這里就不提了蜀变,蘋果每次更新一個(gè)大版本的時(shí)候都會(huì)出現(xiàn)各種各樣的問題悄谐,很多東西也變得越來越復(fù)雜,后面有在項(xiàng)目中碰到問題會(huì)在繼續(xù)更新~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末库北,一起剝皮案震驚了整個(gè)濱河市爬舰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寒瓦,老刑警劉巖情屹,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杂腰,居然都是意外死亡垃你,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門喂很,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惜颇,“玉大人,你說我怎么就攤上這事少辣×枭悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵漓帅,是天一觀的道長锨亏。 經(jīng)常有香客問我,道長忙干,這世上最難降的妖魔是什么屯伞? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮豪直,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘珠移。我一直安慰自己弓乙,他們只是感情好末融,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暇韧,像睡著了一般勾习。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懈玻,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天巧婶,我揣著相機(jī)與錄音,去河邊找鬼涂乌。 笑死艺栈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的湾盒。 我是一名探鬼主播湿右,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼罚勾!你這毒婦竟也來了毅人?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤尖殃,失蹤者是張志新(化名)和其女友劉穎丈莺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送丰,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缔俄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚪战。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牵现。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邀桑,靈堂內(nèi)的尸體忽然破棺而出瞎疼,到底是詐尸還是另有隱情,我是刑警寧澤壁畸,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布贼急,位于F島的核電站,受9級(jí)特大地震影響捏萍,放射性物質(zhì)發(fā)生泄漏太抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一令杈、第九天 我趴在偏房一處隱蔽的房頂上張望走敌。 院中可真熱鬧,春花似錦逗噩、人聲如沸掉丽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捶障。三九已至僧须,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間项炼,已是汗流浹背担平。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锭部,地道東北人暂论。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像空免,于是被迫代替她去往敵國和親空另。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容