在版本更新中,遇到的iOS11适配问题:
1.Tableview的section之间距离加大
原来是只写了:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 1;
}
现在需要增加:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
return nil;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
return nil;
}
tableview的section之间距离就恢复正常了
2.[tableView reloadData] 产生滚动
这个应该是UITableView最大的改变。我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容,实现了estimatedRowHeight属性后,得到的初始contenSize是个估算值,是通过estimatedRowHeight x cell的个数得到的,并不是最终的contenSize,tableView就不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的contenSize。
Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension.
如果目前项目中没有使用estimateRowHeight属性,在iOS11的环境下就要注意了,因为开启Self-Sizing之后,tableView是使用estimateRowHeight属性的,这样就会造成contentSize和contentOffset值的变化,如果是有动画是观察这两个属性的变化进行的,就会造成动画的异常,因为在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是最终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化.
iOS11下,如果没有设置estimateRowHeight的值,也没有设置rowHeight的值,那contentSize计算初始值是 44 * cell的个数,如下图:rowHeight和estimateRowHeight都是默认值UITableViewAutomaticDimension 而rowNum = 15;则初始contentSize = 44 * 15 = 660;(以上原理是网上抄来的)
解决方法:
_orderDetailTableView.estimatedRowHeight = 0;
_orderDetailTableView.estimatedSectionFooterHeight = 0;
_orderDetailTableView.estimatedSectionHeaderHeight = 0;
3.tableview的cell到上下圆角,cell长度被切了一块
原代码:
UIBezierPath *maskPath = [UIBezierPath
bezierPathWithRoundedRect:cell.bounds
byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
cornerRadii:CGSizeMake(3, 3)
];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
maskLayer.frame = cell.bounds
maskLayer.path = maskPath.CGPath;
cell.layer.mask = maskLayer;
现直接写死cell的bounds:
UIBezierPath *maskPath = [UIBezierPath
bezierPathWithRoundedRect:CGRectMake(0, 0, SCREEN_WIDTH - 10, 44)
byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
cornerRadii:CGSizeMake(3, 3)
];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
maskLayer.frame = CGRectMake(0, 0, SCREEN_WIDTH - 10, 44);
maskLayer.path = maskPath.CGPath;
cell.layer.mask = maskLayer;
4.要及时跟新第三方SDK哦,以为对方也会跟新适应iOS11.
5.xcode9.0和往常一样拖入文件的时候,编译报错:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_myViewController", referenced from:
objc-class-ref in TLCityPickerController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法
TAGERTS --> Build phases --> Compile sources --> add(点击加号,手动添加引进的文件的.m文件即可)
个人认为这是xcode的bug吧,感觉下个版本能解决吧不然就太麻烦了
6. WebView的contentInset不起作用了
原代码
self.webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0);
现在发现webview的内容整体上移了49
现修改了:
self.webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0);
if (@available(iOS 11.0, *)) {
self.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
/*
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
UIScrollViewContentInsetAdjustmentAutomatic, // 和UIScrollViewContentInsetAdjustmentScrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
UIScrollViewContentInsetAdjustmentScrollableAxes, // 自动计算内边距
UIScrollViewContentInsetAdjustmentNever, // contentInset 不调整
UIScrollViewContentInsetAdjustmentAlways, //contentinset总是由滚动视图的safeareainsets调整
}
*/
} else {
// Fallback on earlier versions
}
问题搞定~
原因: 如果有一些文本位于UI滚动视图的内部,并包含在导航控制器中,现在一般navigationContollers会传入一个contentInset给其最顶层的viewController的scrollView,在iOS11中进行了一个很大的改变,不再通过scrollView的contentInset属性了,而是新增了一个属性:adjustedContentInset,下面的两张图的对比能够表示adjustContentInset表示的区域。
新增的contentInsetAdjustmentBehavior属性用来配置adjustedContentInset的行为。(抄与网络)
7.Xcode9.0的代码折叠功能那里去了?
第一种:可以使用快捷键command+option+左箭头
第二种:command+单击函数名。弹出框框,选择Fold
还是怀念以前在行数这里点击折叠啊!!!
8.原项目启动的时候屏幕上下都是黑的,还是原来的尺寸
选择Assets.sxassets -> launchImage ,右边勾选iOS8.0 and Later的Portrait.
右边就会显示IphoneX 的启动页图片框框,像素为1125*2436.
放进一张这样的尺寸,再重新运行就OK了
网友评论