美文网首页
iOS适配相关

iOS适配相关

作者: 忆昔溪 | 来源:发表于2017-09-19 09:17 被阅读28次

    问题一

    • 描述
      • 当列表有多余一页的数据,上拉加载数据且reloadData完成后,tableView的contentOffset发生了不必要的变化,导致列表会向上拉动一段位移,观察发现,reloadData之后,tableViewcontentOffset发生了几次变化。
      • 如图


        image.png
    • 原因
      Google了一下,发现原因是 iOS11 中默认开启了Self-Sizing,即Headers, Footers, and Cells都默认开启Self-Sizing,所有estimated高度默认值从iOS11之前的0.0改变为UITableViewAutomaticDimension。我们的项目虽然没有使用estimateRowHeight属性,在iOS11的环境下默认开启Self-Sizing之后,这样就会造成contentSizecontentOffset值发生不可预知的变化,如果是有动画是观察这两个属性的变化进行的,就会造成动画的异常,因为在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是最终的contentSize值,因为不会缓存正确的行高,reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化
    @property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable
    
    • 解决方案
      通过关闭Self-Sizing,可以解决上述问题
    self.tableView.estimatedRowHeight = 0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;
    

    问题二

    • 描述
      • 报名榜样房UI错乱
      • 如图


        image.png
    • 原因
      iOS11对导航栏有较大改动,现在rightBarButtonItem是不能获取到相对于导航栏的坐标了
    _lineImageView.left = frame.origin.x + frame.size.width / 2.0;
    
    • 解决方案
      因没有找到合适获取坐标的方案,所以给定了左边距离边框的宽度
    _lineImageView.left = yScreenWidth - (18.0 + frame.size.width / 2.0);
    

    问题三

    • 描述
      • 各种主页下拉箭头露了出来
      • 如图


        image.png
      • 解决方案
    if (kSystemVersion >= 11.0 && [self.managerOwner isKindOfClass:[UIScrollView class]]) {
                UIScrollView *tempScrollView = (UIScrollView *)self.managerOwner;
                if (@available(iOS 11.0, *)) {
                    tempScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
                }
            }
    

    问题四

    • 描述
      • TabBar发布按钮点击,奔溃!
      • 日志如下
    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<UIView: 0x127dcd820; frame = (0 0; 320 568); layer = <CALayer: 0x1c0239600>> has been added as a subview to <UIVisualEffectView: 0x127dcbda0; frame = (0 0; 320 568); layer = <CALayer: 0x1c022fd00>>. Do not add subviews directly to the visual effect view itself, instead add them to the -contentView.'
    
    • 原因
      查看UIVisualEffectView发现了不能在它上面直接添加子视图,需要添加在它的contentView上
    @property (nonatomic, strong, readonly) UIView *contentView; // Do not add subviews directly to UIVisualEffectView, use this view instead.
    
    • 解决方案
    //[self.bgView addSubview:self.contentView];
    [self.bgView.contentView addSubview:self.contentView];
    

    上面的bgView是UIVisualEffectView

    相关文章

      网友评论

          本文标题:iOS适配相关

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