最近项目升级到iOS 11
,遇到一些问题,在此记录一下!
一. push
新界面,出现一个从左往右并且从下往上移动的问题
解决办法:
设置UIScrollView
的 contentInsetAdjustmentBehavior
的属性值为UIScrollViewContentInsetAdjustmentNever
就可以。
二. 图片保存到相册崩溃问题
iOS11
图片保存到相册需要在在plist
里面权限说明添加:
NSPhotoLibraryAddUsageDescription
相册添加图片权限
三. tableView 向下偏移20问题适配
// tableView 偏移20/64适配
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;//UIScrollView也适用
}else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
四. tableView
如果是Gruop
类型的话,section
之间的间距变宽,执行返回高度的同时还需要执行return UIView
的代理,才起作用。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.1;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
return [[UIView alloc] init];
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
return [[UIView alloc] init];
}
五.tableView
刷新 或者 滚动 出现异常问题。
解决方法:
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
因为在iOS 11
中默认启用Self-Sizing
,Headers, footers, and cells
都默认开启Self-Sizing
, 所有estimated
高度默认值从iOS 11
之前的0
改变为UITableViewAutomaticDimension
。
@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
如果目前项目中没有启用estimateRowHeight
属性,在iOS11
的环境下就要注意,因为开启Self-Sizing
之后,tableView
是使用estimateRowHeight
属性的,这样就会造成contentSize
和 contentOffset
值变化,如果是有动画观察这两个属性的变化进行的,就会造成动画异常,因为在估算行高机制下,contentSize
的值是一点点地变化更新的,所有cell显示完成后才得到最终的contentSize
值。因为不会缓存正确的行高,[tableView raloadData]
的时候,会重新计算contentSize
, 就有可能引起contentOffset
的变化。iOS11
不想使用Self-Sizing
的话,可以通过以下方式关闭:
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
六.__NSArrayI
类型和__NSArrayM
类型直接通过索引获取内容,底部调用函数更改为:
- (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));
所以如果通过拦截器,拦截防止数组越界,应对这个函数进行拦截。具体可以看:FJAvoidCrashMechanism。
七.自定义导航栏 偏移问题
在Xcode 9.0,iOS 11
下,自定义导航栏呈如下状态:
具体原因可以查看这篇文章: App界面适配iOS11(包括iPhoneX的奇葩尺寸
解决办法:
在自定义导航栏内部进行判断:
#import "DJMsgListNavigationBar.h"
@implementation DJMsgListNavigationBar
#pragma mark --- layout method
-(void)layoutSubviews{
[super layoutSubviews];
CGRect rectStatus = [[UIApplication sharedApplication] statusBarFrame];
if (rectStatus.size.height==44.f) {
}else{
if (@available(iOS 11.0, *)) {
for ( UIView*aView in self.subviews) {
if ([NSStringFromClass(aView.classForCoder) isEqualToString:@"_UINavigationBarContentView"]) {
aView.frame = CGRectMake( 0,20,aView.frame.size.width,44);
}
else if ([NSStringFromClass(aView.classForCoder) isEqualToString:@"_UIBarBackground"]) {
aView.frame = CGRectMake(0,0,aView.frame.size.width, 64);
}
}
}
}
}
具体参见: How to correctly set UINavigationBar height in iOS 11