iOS适配相关

问题一

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


      iOS适配相关_第1张图片
      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错乱
    • 如图


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

问题三

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


      iOS适配相关_第3张图片
      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: '> has been added as a subview to >. 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适配相关)