美文网首页
项目中适配iOS11

项目中适配iOS11

作者: 达摩君 | 来源:发表于2017-10-11 19:41 被阅读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.

    相关文章

      网友评论

          本文标题:项目中适配iOS11

          本文链接:https://www.haomeiwen.com/subject/fjqgyxtx.html