项目中适配iOS11

2017-10-11  本文已影响144人  达摩君

在版本更新中,遇到的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了

9.

上一篇 下一篇

猜你喜欢

热点阅读