iOS 11:"adjustedContentInset" 标题栏变大时滚动到顶部?

iOS 11: Scroll to top when "adjustedContentInset" changes with larger title bars?

我注意到此代码在 iOS 11 上没有按预期工作,因为“adjustedContentInset”属性 值随着“ navigationBar" 在滚动期间缩小:

CGFloat contentInsetTop=[scrollView contentInset].top;

if (@available(iOS 11.0, *))
{
    contentInsetTop=[scrollView adjustedContentInset].top;

}
////

[scrollView setContentOffset:CGPointMake(0, -contentInsetTop) animated:YES];

... 例如,这可能开始为 140,然后减少到 88 超出最小滚动偏移量。这意味着如果您调用它,它实际上不会一直滚动到顶部。

除了在 UIScrollView 加载时保留内存中的原始偏移量之外,有没有办法稍后恢复此值以确保它确实确实始终如一地滚动到顶部,无论“adjustedContentInset"?

目前确实没有办法用iOS11做到这一点,我听说了。这样做的唯一方法是捕获初始值并在 navigation/view 控制器的生命周期内存储它。

如果我听到其他消息,我会相应地更新我的答案,但不幸的是,它会在基础 iOS 11 版本中永远被破坏。

我在 iOS 11 中遇到了同样的大标题问题,下面的代码对我有用。

以下代码首先将偏移量滚动到您想要的位置上方合理的大小。值 -204.666666666667 是将“辅助功能”>“较大的文本”>“较大的辅助功能大小”设置为最高的最高值。我敢肯定这不包括其他可能性,但到目前为止它对我有用。 -CGFloat.greatestFiniteMagnitude否则问题太大。

tableView.setContentOffset(CGPoint(x: 0.0, y: -204.666666666667), animated: false)

现在这将为您返回正确调整后的内容大小。为避免滚动得太高,即留白space,只需使用如下值。

var contentOffset = CGPoint.zero // Just setting a variable we can change as needed below, as per iOS version.

if #available(iOS 11, *) {
    contentOffset = CGPoint(x: 0.0, y: -tableView.adjustedContentInset.top)
} else {
    contentOffset = CGPoint(x: 0.0, y: -tableView.contentInset.top)
}

tableView.setContentOffset(contentOffset, animated: false)

总而言之,首先将偏移量设置得更高(在我的例子中为 -204.666666666667,或者只是 -300 或其他),然后重新调整 adjustedContentInset.top 以包括大标题、滚动条等,然后您现在可以根据需要设置内容偏移量。