UIViewController:extendedLayoutIncludesOpaqueBars和滚动视图偏移量
我的应用的视图层次结构非常简单:一个UINavigationController
包含一个UITableViewController
。导航控制器的导航条是不透明的,这会导致在导航的转变,这里看到的表视图的一些奇怪的行为插图:UIViewController:extendedLayoutIncludesOpaqueBars和滚动视图偏移量
要在UITableViewController
解决这个问题,我设置extendedLayoutIncludesOpaqueBars
到true
。这样做正确地扩展了导航栏下的视图,但以我不太明白的方式更改了表格视图contentOffset
的行为。将此属性设置为true
,表视图的Y值为contentOffset
报告它的偏移量应高于导航栏当前高度的偏移量(即滚动表视图1pt时,它会报告其y偏移量为-63pts)。
这让我觉得导航控制器自动管理滚动视图的contentInset
,就像它对半透明酒吧一样。但我看不到有任何证据表明滚动视图的内容插入设置为scrollViewDidScroll()
。即使automaticallyAdjustsScrollViewInsets
在表视图控制器上设置为false
,内容偏移量也不正确,所以它看起来与插入无关。
Apple's documentation about extendedLayoutIncludesOpaqueBars
没有提及滚动视图的内容偏移的行为。不幸的是,更改表格视图的contentInset
并不能解决此问题。
我试着改变表视图控制器的edgesForExtendedLayout
属性来强制它扩展而不影响滚动视图,但是看起来这个属性对于不透明的酒吧是无能为力的。
extendedLayoutIncludesOpaqueBars
是否存在一些隐藏的行为,使滚动视图的内容偏移量变大?或者这可能是一个错误?
你试过了吗?
if #available(iOS 11, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
背景上发生了什么事情 ---
extendedLayoutIncludesOpaqueBars
本质上是告诉你的看法表现得好像导航栏是半透明的。您的视图框架将从导航栏的顶部(底部)开始,而不是在栏的底部。
然后导航控制器会看到您有一个滚动视图,并自动将其插入以补偿该栏所覆盖的区域。
在iOS中,您可以查询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演示,是我认为一个bug(见https://stackoverflow.com/a/46397291/2145198)。
虽然JoniVR的答案应该工作,我解决了我的项目通过设置extendedLayoutIncludesOpaqueBars = true
。
虽然解决这个问题可能不是什么大不了的事,但扩展布局对我来说更像是练习,而不是改变contentInsetAdjustmentBehavior
。将其设置为never
具有更广泛的潜在影响;你告诉它不要关心安全区域,不管安全区域来自哪里。安全区域可能会改变(如旋转时)或者如果您的控制器显示在不同的上下文/容器(如标签栏或不)。
感觉太容易了 - 这工作!我之前尝试过,但只能与extendedLayoutIncludesOpaqueBars设置为true一起使用。将不透明的酒吧属性保留为其默认的假,并且包括此效果很好。谢谢! –
@JohnWickham很高兴我可以帮忙,祝你有个愉快的日子:) – JoniVR