iOS 11 和 iPhone X 適配問題集錦

一、Xcode9下相冊(cè)等訪問權(quán)限問題

查了資料說iOS11下,蘋果對(duì)相冊(cè)的權(quán)限key做了調(diào)整,原來的 NSPhotoLibraryUsageDescription ,在iOS11之后,改成了NSPhotoLibraryAddUsageDescription。
針對(duì)于此測(cè)試了一下應(yīng)用,果然毫無懸念, 立即去 info.plist 把 key 改成NSPhotoLibraryAddUsageDescription, 很快解決問題了.
圖3: info.plist內(nèi)設(shè)置NSPhotoLibraryAddUsageDescription權(quán)限

1.png

二、NSLocationAlwaysAndWhenInUseUsageDeion

在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í)別全部列出,供用戶選擇,顯然更人性化了哈~~

2.jpg

四、 MJRefresh下拉刷新適配 iOS 11和 iPhone X問題

項(xiàng)目在不同的模擬器下分別編譯看效果, 底部自定義 tabbar 顯示沒有問題, 但頂部是隱藏了 NavigationBar并采用了MJRefresh下拉刷新,發(fā)現(xiàn)有錯(cuò)位..


iOS 11 和 iOS 11以下的運(yùn)行對(duì)比
iPhoneX 下拉刷新出現(xiàn)錯(cuò)位問題
我的解決方案:

因?yàn)槲业牟季质?UIScrollVIew, 所以只要設(shè)置 iOS 11的新特性方法contentInsetAdjustmentBehaviorUIScrollViewContentInsetAdjustmentNever就可以了 以此類推,如果是 UITableView 布局的,也是設(shè)置contentInsetAdjustmentBehavior

判定 iOS 11的方法, 官方建議的方法:

以下是官方的屏幕尺寸, 原本最初的想法就是根據(jù)屏幕的高度812pt來判定


官方圖片

官方建議的方法 :

if (@available(iOS 11.0, *)) {
}else{
}
我的適配代碼:
if (@available(iOS 11.0, *)) {
      _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
 } else {
 }
判定iPhoneX的方法 :
#define isIPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? [[UIScreen mainScreen] currentMode].size.height==2436 : NO)

其他的一些相關(guān)適配方法:(摘自 MJRefresh討論區(qū)的解決方案)

  • 注:首先這個(gè)下拉刷新的偏移量并不是MJRefresh造成的,但是確實(shí)需要適配,比如通欄ViewController顯示的時(shí)候,劉海會(huì)遮住下拉刷新的組件,解決辦法是對(duì)下拉刷新控件自定義,調(diào)整內(nèi)部組件的布局,通欄的ViewController地方使用自定義的下拉控件。

對(duì)于iOS11下的iPhoneX適配下拉刷新有以下幾點(diǎn):

1、首先請(qǐng)配置相應(yīng)的啟動(dòng)圖,尺寸是1125*2436;
2、對(duì)于通欄ViewController中的UIScrollView,系統(tǒng)會(huì)默認(rèn)根據(jù)contentInsetAdjustmentBehavior屬性改變其bounds的y值為-44,導(dǎo)致UIScrollView中的所有子控件下移,解決辦法是,對(duì)于通欄ViewController,請(qǐng)?jiān)O(shè)置其UIScrollView的contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever。

其他適配點(diǎn):

1、iOS11下的iPhoneX的導(dǎo)航欄為高度44,狀態(tài)欄高度也調(diào)整為44,所以整個(gè)頂部狀態(tài)欄的高度和導(dǎo)航欄的高度一起是88,自定義導(dǎo)航欄的同學(xué)需要根據(jù)系統(tǒng)機(jī)型控制導(dǎo)航欄高度;
2、iOS11下的iPhoneX的tabBar的高度調(diào)整為83,自定義tabBar的同學(xué)建議使用Frame布局;
3、iOS11下的iPhoneX下,屏幕底部默認(rèn)顯示了長(zhǎng)條狀的Home鍵指示器,可以通過UIViewController (UIHomeIndicatorAutoHidden)分類中的prefersHomeIndicatorAutoHidden來隱藏,但是官方并不建議這樣做。

iPhone X 導(dǎo)航欄錯(cuò)位問題

iOS11下的iPhoneX的導(dǎo)航欄為高度44,狀態(tài)欄高度也調(diào)整為44,所以整個(gè)頂部狀態(tài)欄的高度和導(dǎo)航欄的高度一起是88,所以在自定義導(dǎo)航欄里針對(duì) iPhone X 修改的高度

我的解決方法: 我所有的項(xiàng)目都是使用了宏定義參數(shù)的方法來設(shè)置各種控件的, 所以只要改寫這些相關(guān)宏定義參數(shù), 整個(gè)項(xiàng)目都同步做好了適配, 所以平時(shí)的積累和歸納思維很重要,關(guān)鍵時(shí)刻可以減輕很多不必要的重復(fù)工作量.

/*****宏定義 *****/
//導(dǎo)航欄高度
#define  MANavBarHeight  isIPhoneX ? 88 : 64
//底部Tabbar 高度
#define MATabBarHeight  isIPhoneX ? 83 : 49 
//狀態(tài)欄高度
#define  MAStatusBarHeight  isIPhoneX ? 44 : 20

http://www.itdecent.cn/p/352f101d6df1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容