iOS 工具栏高度取决于初始方向

iOS Toolbar Height Depends on Initial Orientation

我在 iPhone 上的底部 UIToolbar 遇到了一些麻烦。栏的高度似乎取决于我导航到场景时的设备方向,并且在方向更改时不会更新。

  1. 当我以纵向模式导航到场景时,底部栏的高度为 44。然后当我转动 phone(此处为 iPhone XR)时,栏的高度仍然是 44.
  2. 当我以横向模式打开场景时,底栏高度为 49,当我将 phone 竖直时,底栏高度仍为 49。

这可以很容易地用像这个这样的简单的 2 场景应用程序来复制:

最初,这并不是真正的问题 - 用户甚至不会注意到微小的变化。但现在我在拆分视图中使用底部栏。当它最初以纵向打开时,底部工具栏的高度为 44。将 phone 变为横向时,将打开带有自己的工具栏的详细视图,高度为 49。然后我有两个彼此相邻的不同高度的工具栏,这是相当丑陋的:

所以问题是我如何确保工具栏高度在方向更改时更新,或者高度始终相同(例如在电子邮件应用程序中)。我不想对高度进行硬编码,因为它最终会使未来 iOS 版本或不同设备上的情况变得更糟。

我正在使用 Xcode 10.1,运行 在 iPhone 和 iOS 12.1.2.

上的应用程序

我最初通过重写 viewWillTransition(...) 重绘工具栏并假设每个方向的 默认值 尺寸来解决它(基于 Mocha 上面的评论)。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if let bBar = bottomBar { bBar.invalidateIntrinsicContentSize() }
}

这样它应该可以适应未来的 UI 变化,而且我不会冒在应用审批中出现问题的风险(如果修改标准 UI 元素样式在这里会是一个问题)。

更新: 我更喜欢 JoelEsli 的解决方案,尽管在某些情况下这可能是一个不错的选择,所以为了完整起见,我将其保留在这里。

您是手动将工具栏添加到视图中还是使用 navigationController 来管理工具栏?我假设你做到了,因为在旋转时高度不会改变。

导航控制器管理旋转时工具栏的高度。将以下内容添加到 viewDidLoad() 方法将显示导航控制器的工具栏。

navigationController?.setToolbarHidden(false, animated: false)

与您的视图控制器管理工具栏相比,这种方法需要的代码要少一些(少一种方法,少一种输出)。

这是我用来检查工具栏是否在 iPad 和 iPhone Max 模型上正确显示的默认模板: https://github.com/joelesli/TBHeight/

iPad临

iPhone XS 最大

iPad空气2

iPhone 8 加号