【问题标题】:iOS 11 TableView to UIView odd space below navigation bariOS 11 TableView 到导航栏下方的 UIView 奇数空间
【发布时间】: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


【解决方案1】:

我最终通过在我的初始视图控制器中添加 viewWillDisappear 来“修复”这个问题:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.layoutSubviews()
}

对我来说,这解决了问题是有道理的,但它似乎很老套。我正在研究其他途径,但由于它确实构成了主要问题的解决方案,因此我将回答我自己的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2018-01-14
    • 2020-01-25
    • 2020-07-17
    • 2018-03-05
    相关资源
    最近更新 更多