iPhoneX/iOS11最新適配指南

原文鏈接: http://fighting300.com...

iPhone發(fā)布會(huì)前,就隱隱感覺(jué)到一波適配工作要襲來(lái)的趕腳,果然不出所料。
新版iPhone的適配工作主要集中在iPhoneX上,相信大家已經(jīng)對(duì)iPhoneX的劉海記憶深刻了,除了吐槽橄登,留給我們的還有比較麻煩的適配工作。下面簡(jiǎn)單分享下在整理過(guò)程中發(fā)現(xiàn)的適配注意點(diǎn)讥此。(適配工作主要在UI方面拢锹,后續(xù)發(fā)現(xiàn)的適配點(diǎn)會(huì)陸續(xù)補(bǔ)充到該文檔中)

iPhoneX 375x812尺寸圖

上下黑邊問(wèn)題

運(yùn)行新版Xcode的iPhoneX模擬器,你可能發(fā)現(xiàn)之前的APP在iPhoneX屏幕沒(méi)填充滿萄喳,上下有黑色區(qū)域卒稳,應(yīng)該是你的app之前未用LaunchScreen.Storyboard作為啟動(dòng)頁(yè)面,可以使用LaunchScreen來(lái)當(dāng)做入場(chǎng)頁(yè)面他巨,這樣APP才會(huì)自動(dòng)適配為iPhoneX的大小充坑。或者修改Assets中的LaunchImage染突,添加iPhoneX的Launch圖如下(1125*2436)捻爷。

LaunchImage適配

iOS11新增版本判斷API

iOS11版本現(xiàn)在有了簡(jiǎn)單的API,不用再手寫iOS版本判斷了份企。

  if (@available(iOS 11.0, *)) {
    // 版本適配
  }
  // 或者
  #ifdef __IPHONE_11_0   
  #endif

目前沒(méi)發(fā)現(xiàn)有iPhoneX的機(jī)型判斷API也榄,暫時(shí)可以使用size來(lái)做代替判斷。

  #define kDevice_iPhoneX CGSizeEqualToSize(CGSizeMake(375, 812), [[UIScreen mainScreen] bounds].size)
  if (UIScreen.mainScreen.bounds.size.height == 812) {
      NSLog(@"this is iPhone X");
  }

UI適配

導(dǎo)航欄適配

iPhoneX由于多了大圓角司志、傳感器(齊劉海)以及底部訪問(wèn)主屏幕的指示遮擋甜紫,所以需要注意原有這部分內(nèi)容的設(shè)計(jì)降宅。
iOS11前導(dǎo)航欄的高度是64,其中statusBar的高度為20囚霸,而iPhoneX的statusBar高度變?yōu)榱?4钉鸯,如果是自定義的NaviBar,這部分需要做相應(yīng)的適配邮辽。

iPhoneX的底部增加了虛擬Homeq區(qū),由于安全區(qū)域的原因默認(rèn)tabBar的高度由49變?yōu)?3贸营,增高了34吨述,所以自定義的底部TabBar也需要需改其適配方案。
可能有部分APP使用了RN來(lái)實(shí)現(xiàn)頁(yè)面钞脂,不要忘了在RN中修改相應(yīng)NaviBar/TabBar的高度揣云。

iPhoneX尺寸
安全區(qū)域

安全區(qū)域定義了view中可視區(qū)域的部分,幫助我們將view放置在整個(gè)屏幕的可視的部分冰啃。即使把navigationbar設(shè)置為透明的邓夕,系統(tǒng)也認(rèn)為安全區(qū)域是從navigationbar的bottom開始的。這樣保證不被系統(tǒng)的狀態(tài)欄阎毅、或父視圖提供的view如導(dǎo)航欄覆蓋焚刚。

安全區(qū)域

iOS11的UIViewController和UIView新加了-(void)viewSafeAreaInsetsDidChange方法,當(dāng)安全區(qū)域改變后該方法會(huì)被調(diào)用扇调。然后在該方法中根據(jù)safeAreaInses屬性更新子視圖中控件的布局位置矿咕。
當(dāng)然如果你要改變一個(gè)UIViewController的safeAreaInsets值, 可以通過(guò)設(shè)置addtionalSafeAreaInsets屬性來(lái)實(shí)現(xiàn), 例如你要自定義一些特殊的樣式時(shí)。
需要注意的是viewSafeAreaInsetsDidChange在UIViewController中第一次調(diào)用的時(shí)間是在-(void)viewWillAppear:(BOOL)animated調(diào)用之后, 在- (void)viewWillLayoutSubviews調(diào)用之前狼钮。所以可以在viewWillAppear里設(shè)置受影響的頁(yè)面的addtionalSafeAreaInsets屬性碳柱。

- (void)viewSafeAreaInsetsDidChange{
    [super viewSafeAreaInsetsDidChange];
    if (@available(iOS 11.0, *)) {
        NSLog(@"safeAreaInset list= %@",NSStringFromUIEdgeInsets(self.view.safeAreaInsets));
        NSLog(@"safeAreaLayout list= %@",self.view.safeAreaLayoutGuide);
    }
}
UIScrollView & UITableView

測(cè)試過(guò)程中發(fā)現(xiàn)tableView會(huì)有20pt/64pt的偏移,其原因是由于iOS 11廢棄了UIViewController的automaticallyAdjustsScrollViewInsets屬性熬芜,新增了contentInsetAdjustmentBehavior屬性莲镣,所以當(dāng)超出安全區(qū)域時(shí)系統(tǒng)自動(dòng)調(diào)整了SafeAreaInsets,進(jìn)而影響了adjustedContentInset涎拉,在iOS11中決定tableView內(nèi)容與邊緣距離的是adjustedContentInset瑞侮,所以需要設(shè)置UIScrollView的contentInsetAdjustmentBehavior屬性。

1.手動(dòng)適配
如果你使用了UITableView曼库、UIScrollView区岗,可以直接使用以下代碼做適配,這樣系統(tǒng)就不會(huì)主動(dòng)為你設(shè)置邊緣距離毁枯,但是你可能需要手動(dòng)適配UITableView的contenteInset慈缔。

  #ifdef __IPHONE_11_0  
  // 單獨(dú)作用與某個(gè)tableView
  if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
    tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  }
  // 作用與所有的UIScrollView
  UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  // 設(shè)置view的寬高
  tableView.contentInset = UIEdgeInsetsMake(0, 0, 34, 0);
  #endif

2.自動(dòng)適配
設(shè)置contentInsetAdjustmentBehavior屬性為UIScrollViewContentInsetAdjustmentAutomatic,則系統(tǒng)會(huì)自動(dòng)計(jì)算contentView的偏移量种玛。

3.設(shè)置安全區(qū)域的addtionalSafeAreaInset
某些情況下藐鹤,你需要頂部區(qū)域瓤檐,比如廣告區(qū)域覆蓋Status娱节,則可以設(shè)置相應(yīng)頁(yè)面的addtionalSafeAreaInset屬性,這樣系統(tǒng)不會(huì)將safeArea上調(diào)到從status開始肄满。這樣可以提供更好的用戶體驗(yàn)。
例如如果你的SafeAreaInset值為(44,0,0,0)稠歉,則需要設(shè)置相應(yīng)的additionalSafeAreaInsets值為(-44,0,0,0)掰担。

  if (@available(iOS 11.0, *)) {
      self.additionalSafeAreaInsets = UIEdgeInsetsMake(-44, 0, 0, 0);
  } else {
      // Fallback on earlier versions
  }

4.iOS11開始UITableView開啟了自動(dòng)估算行高怒炸,estimatedRowHeight estimatedSectionHeaderHeight estimatedSectionFooterHeight三個(gè)高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension,所以heightForHeaderInSection和viewForHeaderInSection應(yīng)該一起使用阅羹,不然tableView頂部滑動(dòng)的時(shí)候會(huì)有空白勺疼。
在適配過(guò)程中發(fā)現(xiàn)UITableView會(huì)在Header/Footer返回size為負(fù)值的情況下會(huì)(之前遺漏的bug)崩潰,這塊可以自查下捏鱼,而iOS11之前的版本不會(huì)执庐。

其他方案......

另外有人對(duì)iPhoneX整個(gè)UIWindow做了內(nèi)容的調(diào)整,只是UI還是有點(diǎn)丑导梆,感興趣的同學(xué)可以去看看該GitHub耕肩,不過(guò)可能這樣的設(shè)計(jì)方案不會(huì)通過(guò)APPLE的審核。

API適配

LocalAuthentication 本地認(rèn)證

本地認(rèn)證框架提供了從具有指定安全策略(密碼或生物學(xué)特征)的用戶請(qǐng)求身份驗(yàn)證的功能问潭。例如猿诸,要求用戶僅使用Face ID或Touch ID進(jìn)行身份驗(yàn)證,可使用以下代碼:

  let myContext = LAContext()   
  let myLocalizedReasonString = <#String explaining why app needs authentication#>    
  var authError: NSError?   
  if #available(iOS 8.0, macOS 10.12.1, *) {   
      if myContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {   
          myContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: myLocalizedReasonString) { success, evaluateError in
              if success {  
                  // 用戶驗(yàn)證通過(guò)  
              } else {  
                  // 用戶驗(yàn)證失敗狡忙,處理失敗信息  
              }  
          }  
      } else {  
          // 不能執(zhí)行策略驗(yàn)證梳虽,處理驗(yàn)證錯(cuò)誤信息  
      }  
  } else {  
      // Fallback on earlier versions
  }

LAContext新增API如下:

  1. biometryType屬性返回當(dāng)前設(shè)備支持的生物學(xué)特征驗(yàn)證方式,他的值可以分別為typeFaceID灾茁、typeTouchID或者none窜觉。
  2. localizedReason需要驗(yàn)證時(shí)展示在彈框上的提示信息
參考文檔
  1. https://developer.apple.com/videos/fall2017/
  2. https://developer.apple.com/iphone/
  3. http://www.reibang.com/p/0ec6a98302c3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市北专,隨后出現(xiàn)的幾起案子禀挫,更是在濱河造成了極大的恐慌,老刑警劉巖拓颓,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件语婴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砰左,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門匿醒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人缠导,你說(shuō)我怎么就攤上這事廉羔。” “怎么了僻造?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵憋他,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我髓削,道長(zhǎng)举瑰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任蔬螟,我火速辦了婚禮,結(jié)果婚禮上汽畴,老公的妹妹穿的比我還像新娘旧巾。我一直安慰自己,他們只是感情好忍些,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布鲁猩。 她就那樣靜靜地躺著罢坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隙券。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天娱仔,我揣著相機(jī)與錄音游桩,去河邊找鬼。 笑死盹憎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陪每。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼俯艰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锌订!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辆飘,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芹关,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥衬,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跑芳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀樟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡往堡,死狀恐怖共耍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痹兜,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布庸娱,位于F島的核電站,受9級(jí)特大地震影響谐算,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洲脂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望往果。 院中可真熱鬧,春花似錦陕贮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眶明。三九已至,卻和暖如春搜囱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜀肘。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工冰单, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诫欠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓荒叼,卻偏偏與公主長(zhǎng)得像典鸡,于是被迫代替她去往敵國(guó)和親被廓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫁乘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 前言 蘋果WWDC開發(fā)者大會(huì)上球碉,終于發(fā)布了大家期待已久的iOS 11,有些新特性功能確實(shí)出人意料挎春。不過(guò)大的方面蘋果...
    Mr_Say_Yes閱讀 3,297評(píng)論 6 15
  • 一、前言 iOS11發(fā)布也有一段時(shí)間了直奋,每次版本升級(jí),相關(guān)的適配工作當(dāng)然是下個(gè)版本的核心工作之一脚线。而且這次iOS1...
    景銘巴巴閱讀 10,971評(píng)論 8 105
  • 隨著Xcode GM版本發(fā)布,適配iOS 11也就提上了日程丰涉,總的來(lái)說(shuō)整個(gè)適配過(guò)程不是很麻煩。建議觀看今年WWDC...
    iOS駱駝閱讀 2,689評(píng)論 1 6
  • 1.找 要想過(guò)真正有意義的生活斯碌,首要任務(wù)是要找到真正有意義的事。每天騰出時(shí)間來(lái)思考當(dāng)天所做的事情傻唾,有助于自己反思,...
    sharemy的簡(jiǎn)書閱讀 173評(píng)論 0 0
  • 雙重身份暴露的我 還怎樣表白 明明可以全身而退 卻被一眼看穿了謊言 在我們的世界里 始終沒(méi)有找到我的專屬角色
    FM117閱讀 87評(píng)論 0 0