【发布时间】:2018-07-09 11:45:06
【问题描述】:
我有一个 UIViewController 和一个嵌入的 UITableView。单击此表格视图中的单元格时,我使用pushViewController 将目标控制器推送到所有这些都嵌入其中的导航控制器中。
导航项有一个UISearchBar 作为titleView 使用(在viewDidLoad):
let searchBar = UISearchBar()
searchBar.delegate = self
navigationItem.titleView = searchBar
当新视图控制器被推送并加载新视图时,导航栏底部有一个奇怪的间隙。似乎它试图保留导航栏的现有高度(由于搜索栏而更高),而不是在默认情况下发生的过渡期间放大和缩小。这是一个示例(UIView 被涂成黑色以突出显示这一点)
如您所见,当我滑回表格视图时,它似乎修复了第二个视图,但随后表格视图的偏移量被破坏了。
我已经尝试用一个新的 Xcode 项目来重现它,但我做不到。一切正常。显然我实际上并不想创建一个新项目,所以我想弄清楚我做错了什么。
我认为这个问题可能类似:
iOS 7 UITableView: How to remove space between navigation bar and first cell
但我不希望初始导航栏的高度更小,而且我还弄乱了在其他各种问题中建议的所有插图,但这些变体也都不起作用。
我对第二个控制器中的 tableview 和嵌入式滚动视图都有 IB 约束,它们都设置为与安全区域对齐。
我猜我遗漏了一些明显的东西,但我对向后滑动的行为感到特别困惑。
有什么想法吗?
【问题讨论】:
-
在我看来,这与您设置约束的方式/时间有关。您是否在某处手动设置了一些约束?
-
@iur 如果手动是指在代码中,那么不,我没有。不过,我在几个地方确实有一些 IB 限制。我将尝试将它们全部删除,看看会发生什么(当我下午晚些时候回到代码时)
-
嗯,我明白了。从您的图像来看,约束似乎是延迟应用的。也许你的搜索栏搞砸了。也可能与 iOS 11 中滚动视图的
contentInsetAdjustmentBehavior有关。 -
@iur 我从所有视图中删除了 all IB 约束并使用
contentInsetAdjustmentBehavior(将其分配给.never,然后在不起作用时使用其他变体)。该行为仍然存在 -
如果您删除搜索栏会怎样?可能是将其设置为导航栏的标题会破坏约束。从您的 gif 的外观看来,您的 tableview 被固定到导航栏底部(可能到安全区域顶部)并且将标题设置为导航栏不会更改约束(或不立即要求重新布局),因此您的 tableview 内容是“在“搜索栏下。要检查的另一件事是要求导航栏重新布局,设置搜索栏后立即调用
setNeedsLayout。
标签: ios iphone xcode uitableview uiscrollview