iOS11需要适配的地方
SDK API兼容
编译时检查SDK版本,运行时检查系统版本,不同版本的SDK API并不是一句 if ([UIDevice currentDevice].systemVersion.floatValue 或者一句if (@available)能解决的。还要结合宏定义来进行SDK编译时判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//__IPHONE_11_0 判断最好直接使用数值,使用低版本SDK的时候,__IPHONE_11_0未必在系统中存在 // 编译时判断:检查SDK版本 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 // 运行时判断:检查当前系统版本 if ([UIDevice currentDevice].systemVersion.floatValue > 11.0f) { self.view.safeAreaLayoutGuide; } else { // 用旧的代替 self.topLayoutGuide; } #else // 用旧的代替 self.topLayoutGuide; #endif |
StatusBar与Tabbar高度变化
在iPhone X系统会自动修改StatusBar与Tabbar的高度,Tabbar从49pt变为83pt。StatusBar由20pt变为了44pt
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 不执行
UITableView:默认开启Self-Sizing,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension,大概就是说我们不再需要自己去计算cell的高度了,只要设置好这两个属性,约束好布局,系统会自动计算好cell的高度。
iOS 11上会导致tableView顶部留白,原因是代码中只实现了heightForHeaderInSection方法,而没有实现viewForHeaderInSection方法。iOS 11之后应该是由于开启了估算行高机制引起了bug。添加上viewForHeaderInSection方法后,问题就解决了。或者添加以下代码关闭估算行高,问题也得到解决。
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(iOS 11.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 = [UIApplication sharedApplication]; NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; NSString *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { dataNetworkItemView = subview; break; } } int signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue]; NSLog(@"signal %d", signalStrength); } |
由于iPhoneX的留海设计,所以元素与布局都发现了变化。
1 |
id statusBar = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar"]; |
断点后执行
1 |
po [statusBar recursiveDescription] |
即可查看新的结构
NavgationBar变化
1、导航栏新增了一种大标题样式,默认设置是不开启,所以不需要修改。如果开启大标题样式 iPhone X的顶部高度为44 +44+52 = 140,其他机型为20 +44+52 = 116
2、titleView支持autolayout,这要求titleView必须是能够自撑开的或实现了- intrinsicContentSize
解决方案
1 2 3 |
- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; } |
滑动删除会崩
在iOS8之后,苹果官方增加了UITableVIew的右滑操作接口,即新增了一个代理方法(tableView: editActionsForRowAtIndexPath:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,我们可以在这个代理方法中定义所需要的操作按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction。这个类只能定义按钮的显示文字、背景色、和按钮事件。并且返回数组的第一个元素在UITableViewCell的最右侧显示,最后一个元素在最左侧显示。
从iOS 11开始有了一些改变,首先是可以给这些按钮添加图片了,然后是如果实现了以下两个iOS 11新增的代理方法,将会取代(tableView: editActionsForRowAtIndexPath:)代理方法:
1 2 3 4 |
// Swipe actions // These methods supersede -editActionsForRowAtIndexPath: if implemented - (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath - (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath |
Xcode9问题
文件拖拽
拖拽类或者资源文件工程,即使选了copy file in need, 选了target,等拖入项目后,文件是进去了,但是traget真实并没有选上。所有找不到类,使用不了资源。
解决办法只能是事后选择target,或者右键Project navgation,add file来添加文件。
Xcode9运行项目会发现App没有充满屏幕,上下会有黑色区域
解决方案:
添加1125 * 2436启动图,或者使用LaunchScreen.storyboard
更多阅读
转载请注明:天狐博客 » iOS11及Xcode9适配问题汇总