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

Posted

技术标签:

【中文标题】iOS 工具栏高度取决于初始方向【英文标题】:iOS Toolbar Height Depends on Initial Orientation 【发布时间】:2019-01-04 22:17:10 【问题描述】:

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

    当我以纵向模式导航到场景时,底部栏的高度为 44。当我转动手机(此处为 iPhone XR)时,栏的高度仍为 44。 当我以横向模式打开场景时,底栏高度为 49,当我将手机竖直时也保持为 49。

这可以通过简单的 2 场景应用程序轻松复制,例如:

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

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

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

【问题讨论】:

方向改变时..更新工具栏高度***.com/questions/38894031/…***.com/questions/2135407/… 谢谢你,@Mocha。这可能是要走的路。但是,正如我所说,我想避免对高度进行硬编码,因为这可能会导致其他问题。最好使工具栏与任何其他标准元素一样,为每个方向假定其自然尺寸。我不确定,但我认为这是预期的默认行为。因此,标准元素的默认尺寸不取决于方向而是取决于初始方向这一事实让我有点困惑。 它不是真的硬编码高度,因为它基于工具栏的高度。 是的,你是对的(抱歉,我在之前的回复中略微误解了你的评论)。这是一种选择。如果你想添加你的答案,我很乐意给予信任并删除我的。无论如何,JoelEsli 的答案更接近我想要的。 【参考方案1】:

您是手动将工具栏添加到视图中还是使用导航控制器来管理工具栏?我假设您这样做了,因为旋转时高度没有变化。

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

navigationController?.setToolbarHidden(false, animated: false)

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

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

iPad Pro

iPhone XS Max

iPad Air 2

iPhone 8 Plus

【讨论】:

没错,我手动添加了工具栏。这看起来不错,而且比我想出的要少得多。我会试一试,让你知道。谢谢! 我很抱歉。这几天我没在办公室。我会看看我是否可以在今天或最迟在周末检查它,然后标记答案。它看起来不错,非常感谢。 已验证。这很好用,正是我想要的。感谢您付出的巨大努力,包括演示项目。 ?? 利用 SDK 是最简单的方法。很高兴它有帮助。【参考方案2】:

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

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

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

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

【讨论】:

以上是关于iOS 工具栏高度取决于初始方向的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UIToolbar 的高度? [复制]

iOS小技能:适配安全区域高度

针对不同方向的不同自动布局约束集

iOS UIView 的动态高度取决于内部元素的数量

ios swift - 表格视图单元格动态高度取决于设备

iphone动态滚动视图的问题