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

时间:2019-01-04 22:17:10

标签: ios swift interface-builder uitoolbar

我在使用iPhone底部的UIToolbar时遇到了一些麻烦。当我导航到场景时,条形的高度似乎取决于设备的方向,而当方向改变时,条形的高度不会更新。

  1. 当我以纵向模式导航到场景时,底部栏的高度为44。然后,当我转动手机(此处为iPhone XR)时,栏的高度仍然为44。
  2. 当我以横向模式打开场景时,底部栏的高度为49,而当我将手机直立放置时,其底部高度也保持为49。

可以使用以下简单的2场景应用轻松重现此内容: demo app

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

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

我正在使用Xcode 10.1,并在装有iOS 12.1.2的iPhone上运行该应用程序。

2 个答案:

答案 0 :(得分:1)

您是将工具栏手动添加到视图上还是正在使用navigationController管理工具栏?我假设您这样做了,因为旋转时高度没有变化。

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

navigationController?.setToolbarHidden(false, animated: false)

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

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

iPad Pro enter image description here

iPhone XS Max enter image description here

iPad Air 2 enter image description here

iPhone 8 Plus enter image description here

答案 1 :(得分:0)

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

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

这样,它就可以适应将来的UI更改,并且我不冒险在应用程序审批中遇到麻烦(如果在这里修改标准UI元素样式会成为问题)。

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