看着网络上铺天盖地的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 计算内边距
各位看管若是以为写的还能够能够点一波关注跟收藏!