一、Xcode9下相冊等訪問權限問題
查了資料說iOS11下,蘋果對相冊的權限key做了調整,原來的 NSPhotoLibraryUsageDescription ,在iOS11之后,改成了NSPhotoLibraryAddUsageDescription。
針對于此測試了一下應用,果然毫無懸念, 立即去 info.plist 把 key 改成NSPhotoLibraryAddUsageDescription, 很快解決問題了.
圖3: info.plist內設置NSPhotoLibraryAddUsageDescription權限
二、NSLocationAlwaysAndWhenInUseUsageDeion
在IOS11,原有的NSLocationAlwaysUsageDeion被降級為NSLocationWhenInUseUsageDeion。因此,在原來項目中使用requestAlwaysAuthorization獲取定位權限,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系統框不會彈出。建議新舊key值都在plist里配置,反正我試下來是沒有問題,唯一的區別是使用requestAlwaysAuthorization獲取權限 IOS11系統彈框會把幾種權限級別全部列出,供用戶選擇,顯然更人性化了哈~~
四、 MJRefresh下拉刷新適配 iOS 11和 iPhone X問題
項目在不同的模擬器下分別編譯看效果, 底部自定義 tabbar 顯示沒有問題, 但頂部是隱藏了 NavigationBar并采用了MJRefresh下拉刷新,發現有錯位..
我的解決方案:
因為我的布局是 UIScrollVIew, 所以只要設置 iOS 11的新特性方法contentInsetAdjustmentBehavior
為UIScrollViewContentInsetAdjustmentNever
就可以了 以此類推,如果是 UITableView 布局的,也是設置contentInsetAdjustmentBehavior
。
判定 iOS 11的方法, 官方建議的方法:
以下是官方的屏幕尺寸, 原本最初的想法就是根據屏幕的高度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)
其他的一些相關適配方法:(摘自 MJRefresh討論區的解決方案)
注:首先這個下拉刷新的偏移量并不是MJRefresh造成的,但是確實需要適配,比如通欄ViewController顯示的時候,劉海會遮住下拉刷新的組件,解決辦法是對下拉刷新控件自定義,調整內部組件的布局,通欄的ViewController地方使用自定義的下拉控件。
對于iOS11下的iPhoneX適配下拉刷新有以下幾點:
1、首先請配置相應的啟動圖,尺寸是1125*2436;
2、對于通欄ViewController中的UIScrollView,系統會默認根據contentInsetAdjustmentBehavior屬性改變其bounds的y值為-44,導致UIScrollView中的所有子控件下移,解決辦法是,對于通欄ViewController,請設置其UIScrollView的contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever。
其他適配點:
1、iOS11下的iPhoneX的導航欄為高度44,狀態欄高度也調整為44,所以整個頂部狀態欄的高度和導航欄的高度一起是88,自定義導航欄的同學需要根據系統機型控制導航欄高度;
2、iOS11下的iPhoneX的tabBar的高度調整為83,自定義tabBar的同學建議使用Frame布局;
3、iOS11下的iPhoneX下,屏幕底部默認顯示了長條狀的Home鍵指示器,可以通過UIViewController (UIHomeIndicatorAutoHidden)分類中的prefersHomeIndicatorAutoHidden來隱藏,但是官方并不建議這樣做。
iPhone X 導航欄錯位問題
iOS11下的iPhoneX的導航欄為高度44,狀態欄高度也調整為44,所以整個頂部狀態欄的高度和導航欄的高度一起是88,所以在自定義導航欄里針對 iPhone X 修改的高度
我的解決方法: 我所有的項目都是使用了宏定義參數的方法來設置各種控件的, 所以只要改寫這些相關宏定義參數, 整個項目都同步做好了適配, 所以平時的積累和歸納思維很重要,關鍵時刻可以減輕很多不必要的重復工作量.
/*****宏定義 *****/
//導航欄高度
#define MANavBarHeight isIPhoneX ? 88 : 64
//底部Tabbar 高度
#define MATabBarHeight isIPhoneX ? 83 : 49
//狀態欄高度
#define MAStatusBarHeight isIPhoneX ? 44 : 20