iOS 工具栏高度取决于初始方向
iOS Toolbar Height Depends on Initial Orientation
我在 iPhone 上的底部 UIToolbar 遇到了一些麻烦。栏的高度似乎取决于我导航到场景时的设备方向,并且在方向更改时不会更新。
- 当我以纵向模式导航到场景时,底部栏的高度为 44。然后当我转动 phone(此处为 iPhone XR)时,栏的高度仍然是 44.
- 当我以横向模式打开场景时,底栏高度为 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 加号
我在 iPhone 上的底部 UIToolbar 遇到了一些麻烦。栏的高度似乎取决于我导航到场景时的设备方向,并且在方向更改时不会更新。
- 当我以纵向模式导航到场景时,底部栏的高度为 44。然后当我转动 phone(此处为 iPhone XR)时,栏的高度仍然是 44.
- 当我以横向模式打开场景时,底栏高度为 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 加号