UIViewController:extendedLayoutIncludesOpaqueBars和滚动视图偏移量

时间:2017-10-18 14:26:34

标签: ios uitableview uiviewcontroller uinavigationcontroller uikit

我的应用视图层次结构非常简单:UINavigationController包含UITableViewController。导航控制器的导航栏是不透明的,导致在导航过渡期间表视图出现一些奇怪的插入行为,如下所示:

Navigation Inset Issue

要解决此问题,我要在extendedLayoutIncludesOpaqueBars上将true设置为UITableViewController。这样做会正确地扩展导航栏下方的视图,但会以我不太了解的方式更改表格视图contentOffset的行为。将此属性设置为true时,表格视图的contentOffset的Y值会报告它的偏移量应高于导航栏的当前高度(即滚动表视图1pt,它报告它的y偏移是-63pts)。

这让我觉得导航控制器自动管理滚动视图的contentInset,就像半透明条一样。但我无法看到任何证据表明滚动视图在scrollViewDidScroll()中设置了内容插入内容。即使表格视图控制器上的automaticallyAdjustsScrollViewInsets设置为false,内容偏移量也不对,所以它似乎与插图无关。

Apple's documentation about extendedLayoutIncludesOpaqueBars没有提及滚动视图内容偏移行为的任何影响。不幸的是,更改表格视图的contentInset并不能解决这个问题。

我尝试更改表视图控制器的edgesForExtendedLayout属性以强制它在不影响滚动视图的情况下进行扩展,但看起来这个属性对不透明条形图无能为力。

extendedLayoutIncludesOpaqueBars是否有一些隐藏的行为会导致滚动视图的内容偏移?或者这可能是一个错误?

3 个答案:

答案 0 :(得分:3)

你试过这个吗?

if #available(iOS 11, *) {
    tableView.contentInsetAdjustmentBehavior = .never
}

答案 1 :(得分:3)

背景 ---

extendedLayoutIncludesOpaqueBars基本上告诉您的视图表现得好像导航栏是半透明的。然后,您的视图框架将从导航栏的顶部(下方)开始,而不是在条形图的底部。

然后导航控制器会看到您有一个滚动视图,并自动对其进行插入以补偿条形所覆盖的区域。

在iOS 10 中,您可以查询contentInset并查看top = 64插页。但是,在iOS 11中,contentInset严格用于您控制的任何自定义插入 - 您应该使用adjustedContentInset,这是您的自定义插入内容和任何安全区域插入内容的总和。

adjustedContentInset - 
The insets derived from the content insets and the safe area of the scroll view.

contentInset - 
The custom distance that the content view is inset from the safe area or scroll view edges.

实际上,-63的y偏移是有意义的,如果你的酒吧是半透明的,你会看到同样的事情。

您正在谈论的问题,您的GIF演示了,我认为是一个错误(请参阅https://stackoverflow.com/a/46397291/2145198)。

虽然JoniVR的答案应该有效,但我在项目中通过设置extendedLayoutIncludesOpaqueBars = true解决了这个问题。

虽然你解决它可能不是什么大问题,但扩展布局对我来说感觉更好,而不是改变contentInsetAdjustmentBehavior。将其设置为never会产生更广泛的潜在影响;无论安全区域来自何处,您都要告诉它永远不关心安全区域。安全区域可能会发生变化(如轮换时),或者您的控制器是否在不同的上下文/容器中呈现(如标签栏或非标签栏)。

答案 2 :(得分:3)

正如@beebcon之前指出的那样,这确实是一个错误(Apple工程师在推特上证实),应该在iOS 11.2中修复。

first tweet enter image description here

(对不起,我使用了图片,但这样一来,如果推文消失,它就不会消失)