我的应用视图层次结构非常简单:UINavigationController
包含UITableViewController
。导航控制器的导航栏是不透明的,导致在导航过渡期间表视图出现一些奇怪的插入行为,如下所示:
要解决此问题,我要在extendedLayoutIncludesOpaqueBars
上将true
设置为UITableViewController
。这样做会正确地扩展导航栏下方的视图,但会以我不太了解的方式更改表格视图contentOffset
的行为。将此属性设置为true
时,表格视图的contentOffset
的Y值会报告它的偏移量应高于导航栏的当前高度(即滚动表视图1pt,它报告它的y偏移是-63pts)。
这让我觉得导航控制器自动管理滚动视图的contentInset
,就像半透明条一样。但我无法看到任何证据表明滚动视图在scrollViewDidScroll()
中设置了内容插入内容。即使表格视图控制器上的automaticallyAdjustsScrollViewInsets
设置为false
,内容偏移量也不对,所以它似乎与插图无关。
Apple's documentation about extendedLayoutIncludesOpaqueBars
没有提及滚动视图内容偏移行为的任何影响。不幸的是,更改表格视图的contentInset
并不能解决这个问题。
我尝试更改表视图控制器的edgesForExtendedLayout
属性以强制它在不影响滚动视图的情况下进行扩展,但看起来这个属性对不透明条形图无能为力。
extendedLayoutIncludesOpaqueBars
是否有一些隐藏的行为会导致滚动视图的内容偏移?或者这可能是一个错误?
答案 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)