iOS11 & iPhone X 上UIScrollView(U

2017-12-20  本文已影响0人  adown

原因

安全区域

adjustContentInset 属性的计算方式

首先看UIScrollView在iOS11新增的两个属性:adjustContentInsetcontentInsetAdjustmentBehavior

  1. UIScrollViewContentInsetAdjustmentAutomatic:如果scrollView在一个automaticallyAdjustsScrollViewContentInset = YESUIViewController上,并且这个UIViewController包含在一个UINavigationController中,这种情况下会设置在top & bottomadjustedContentInset = safeAreaInset + contentInset不管是否滚动。其他情况下与UIScrollViewContentInsetAdjustmentScrollableAxes相同。

  2. UIScrollViewContentInsetAdjustmentScrollableAxes: 在可滚动方向上adjustedContentInset = safeAreaInset + contentInset,在不可滚动方向上adjustedContentInset = contentInset;依赖于scrollEnabledalwaysBounceHorizontal / Vertical = YESscrollEnabled默认为Yes,所以大多数情况下,计算方式还是adjustedContentInset = safeAreaInset + contentInset

  3. UIScrollViewContentInsetAdjustmentNeveradjustedContentInset = contentInset 。当contentInsetAdjustmentBehavior设置为UIScrollViewContentInsetAdjustmentNever的时候,adjustContentInset值不受safeAreaInset值的影响。

  4. UIScrollViewContentInsetAdjustmentAlwaysadjustedContentInset = safeAreaInset + contentInset

解决方法

  1. 重新设置tableViewcontentInset值,来抵消掉safeAreaInset值,因为adjustedContentInset = contentInset + safeAreaInset

  2. 设置tableViewcontentInsetAdjustmentBehavior属性为UIScrollViewContentInsetAdjustmentNever,这样adjustedContentInset = contentInset

    // 新API:`@available(iOS 11.0, *)` 可用来判断系统版本
    if ( @available(iOS 11.0, *) ) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }
  1. 设置iOS11UIViewController新增属性addtionalSafeAreaInset
    iOS 11之前,大家是通过将UIViewControllerautomaticallyAdjustsScrollViewInsets属性设置为NO,来禁止系统调整tableViewcontentInset。如果还是想从controller级别解决问题,可以通过设置controlleradditionalSafeAreaInsets属性,因为当tableViewframe没有超出安全区域范围时,系统就不会调整tableViewsafeAreaInset值,从而也就不会发生内容偏移情况。

组头组尾高度

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
上一篇 下一篇

猜你喜欢

热点阅读