3

我的应用的视图层次结构非常简单:一个UINavigationController包含一个UITableViewController。导航控制器的导航条是不透明的,这会导致在导航的转变,这里看到的表视图的一些奇怪的行为插图:UIViewController:extendedLayoutIncludesOpaqueBars和滚动视图偏移量

Navigation Inset Issue

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

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

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

我试着改变表视图​​控制器的edgesForExtendedLayout属性来强制它扩展而不影响滚动视图,但是看起来这个属性对于不透明的酒吧是无能为力的。

extendedLayoutIncludesOpaqueBars是否存在一些隐藏的行为,使滚动视图的内容偏移量变大?或者这可能是一个错误?

回答

2

你试过了吗?

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

感觉太容易了 - 这工作!我之前尝试过,但只能与extendedLayoutIncludesOpaqueBars设置为true一起使用。将不透明的酒吧属性保留为其默认的假,并且包括此效果很好。谢谢! –

+0

@JohnWickham很高兴我可以帮忙,祝你有个愉快的日子:) – JoniVR

1

背景上发生了什么事情 ---

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具有更广泛的潜在影响;你告诉它不要关心安全区域,不管安全区域来自哪里。安全区域可能会改变(如旋转时)或者如果您的控制器显示在不同的上下文/容器(如标签栏或不)。

+0

'contentInset'与'adjustedContentInset'总有一点意义 - 我完全错过了有一个新的属性。 –

+0

是的,它很讨厌 - 我在'UIScrollView'上添加了一个category方法,我调用'totalContentInset'来检查'if(@available(iOS 11.0,*))'给我调整的,否则常规插入 – beebcon

+0

@beebcon Nice答案,你是绝对正确的! – JoniVR

2

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

first tweet enter image description here

(对不起,我使用的图像,但这种方式也不会消失的情况下,鸣叫消失)