看着網絡上鋪天蓋地的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 計算內邊距
各位看管若是以爲寫的還能夠能夠點一波關注跟收藏!