iOS11以及Xcode9適配問題以及方法彙總

看着網絡上鋪天蓋地的iOS11的消息,做爲一枚iOS從業者誰又會無動於衷呢!帶着這份好奇,升級了macOS到10.12.4(Xcode9需10.12.4及以上系統),下載安裝了Xcode9.0 Beta。網絡


這是個人一個iOS交流羣659170228,無論小白仍是老司機,都歡迎入駐,你們一塊兒交流成長!app

單從這幾天體驗來說,Xcode9不愧爲一篇佳做,代碼預覽、編譯速度等都有較大提高,最讓人眼前一亮的莫過於Xcode9將版本管理系統獨立出來了一個模塊,在同一局域網下支持無線部署調試。說真心話,若是不是怕上線項目出問題,真心不想切到Xcode8來開發。佈局


Xcode9下相冊等訪問權限問題atom

以前項目中相機功能一直使用系統自帶的PickerView,說實話不甚美觀,本身空閒之餘一直着手開發自定義相機(EVNCamera:給個StarO(∩_∩)O~)。在Xcode9的首個Beta版本中開發相機功能時發現,原有項目居然crash,後來發現iOS11下,蘋果對相冊的權限key作了調整,原來的 NSPhotoLibraryUsageDescription ,在iOS11以後,改爲了NSPhotoLibraryAddUsageDescription。設計

詳見:Cocoa Keys調試

不過有童鞋反饋使用Xcode 9 Beta3中打包應用,使用原有相冊權限NSPhotoLibraryUsageDescription依舊正常,本人嘗試Xcode 9 Beta4中打包,使用原來相冊權限的key依舊crash。code

近場通信NFC權限cdn

在iOS11中,蘋果開放了NFC(Near field communication),怕也是其推廣ApplePay的一種策略。blog

在使用近場通信時,首先也要在info.plist配置NFCReaderUsageDescription 權限,案例步驟,以下:ip

iOS 11 Core NFC - any sample code?

iOS11須要適配的地方

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 不執行

一:UITableView:默認開啓Self-Sizing,大概就是說咱們再也不須要本身去計算cell的高度了,只要設置好這兩個屬性,約束好佈局,系統會自動計算好cell的高度。iOS11之後,Self-Sizing默認開啓,包括Headers, footers。若是項目中沒使用estimatedRowHeight屬性,在iOS11下會有奇奇怪怪的現象,由於iOS11以前,estimatedRowHeight默認爲0,Self-Sizing自動打開後,contentSize和contentOffset均可能發生改變。能夠經過如下方式禁用:

self.tableView.estimatedRowHeight = 0;

self.tableView.estimatedSectionHeaderHeight = 0;

self.tableView.estimatedSectionFooterHeight = 0;

automaticallyAdjustsScrollViewInsets 被廢棄,TabView,CollectionView間距問題

解決方案

automaticallyAdjustsScrollViewInsets屬性已經再也不使用,咱們須要使用UIScrollView

contentInsetAdjustmentBehavior

屬性來 替代它.

設置適當的枚舉

1

2

3

4

5

6

if(@available(iOS11.0,*)){

self.tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;

}

else{

self.automaticallyAdjustsScrollViewInsets=NO;

}

NSLocationAlwaysAndWhenInUseUsageDeion

在iOS11,原有的NSLocationAlwaysUsageDeion被降級爲NSLocationWhenInUseUsageDeion。所以,在原來項目中使用requestAlwaysAuthorization獲取定位權限,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系統框不會彈出。

iPhone X狀態欄圖標元素結構變了

咱們以前經過遍歷foregroundView,UIStatusBarDataNetworkItemView能夠找到wifi信號強度。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

-(void)getSignalStrength{

UIApplication*app=[UIApplicationsharedApplication];

NSArray*subviews=[[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];

NSString*dataNetworkItemView=nil;

for(idsubview insubviews){

if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView")class]]){

dataNetworkItemView=subview;

break;

}

}

intsignalStrength=[[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];

NSLog(@"signal %d",signalStrength);

}

因爲iPhoneX的留海設計,因此元素與佈局都發現了變化。

1

idstatusBar=[[UIApplicationsharedApplication] valueForKeyPath:@"statusBar"];

斷點後執行

1

po[statusBar recursiveDescription]

便可查看新的結構

二:navigation bar

一、導航欄新增了一種大標題樣式,默認設置是不開啓,因此不須要修改。

二、titleView支持autolayout,這要求titleView必須是可以自撐開的或實現了- intrinsicContentSize

解決方案

1

2

3

-(CGSize)intrinsicContentSize{

returnUILayoutFittingExpandedSize;

}

三:ScrollView

若是有一些文本位於UI滾動視圖的內部,幷包含在導航控制器中,如今通常navigationContollers會傳入一個contentInset給其最頂層的viewController的scrollView,在iOS11中進行了一個很大的改變,再也不經過scrollView的contentInset屬性了,而是新增了一個屬性:adjustedContentInset,經過下面兩種圖的對比,可以表示adjustContentInset表示的區域:


新增的contentInsetAdjustmentBehavior屬性用來配置adjustedContentInset的行爲,該結構體有如下幾種類型:

typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {

UIScrollViewContentInsetAdjustmentAutomatic,

UIScrollViewContentInsetAdjustmentScrollableAxes,

UIScrollViewContentInsetAdjustmentNever,

UIScrollViewContentInsetAdjustmentAlways,

}

@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior;

@property(nonatomic, readonly) UIEdgeInsets adjustedContentInset;

//adjustedContentInset值被改變的delegate

- (void)adjustedContentInsetDidChange;

- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView;

UIScrollViewContentInsetAdjustmentBehavior 是一個枚舉類型,值有如下幾種:

  • automatic 和scrollableAxes同樣,scrollView會自動計算和適應頂部和底部的內邊距而且在scrollView 不可滾動時,也會設置內邊距.

  • scrollableAxes 自動計算內邊距.

  • never不計算內邊距

  • always 根據safeAreaInsets 計算內邊距


各位看管若是以爲寫的還能夠能夠點一波關注跟收藏!

相關文章
相關標籤/搜索