问题描述
问题: 我想在 iPad 上的纵向与横向之间有不同的布局。 (我在 iPhone 上成功了,但 iPad 共享相似的尺寸类别)
我做过/尝试过的:
通过 Google 和 SO 阅读和搜索,我还没有找到解决方案。我所学到的是覆盖 UITraitsCollection
,如果可能,我想强制 iPad 横向配置遵循我已经使用 hCompact
为 iPhone 横向模式设置的配置>
我尝试了这个解决方案 https://stackoverflow.com/a/60409218/14414215,但不确定把它放在哪里,当刚放在 UIViewController
中时,在运行时,应用程序甚至不会调用它。 (很可能是因为我在 childViewController 中没有我的视图?)
此处的这篇文章也引用了 UITraitsCollection
https://stackoverflow.com/a/41374705/14414215,但缺少示例。
我很确定这是许多应用程序都在做的事情,但我找不到解决方案。
供参考:这也是我想在 iPad 上实现的目标。 (iPhone 使用@DonMag 的这个解决方案效果很好)
StackView layout side by side & on Top of each other (like zStack)
解决方法
对于不同的设备屏幕纵横比, iPad 上的多任务处理功能,鼓励您考虑尺寸不是方向。
如果您的应用使用 Slide Over/Split View 运行,则即使设备处于“横向”,尺寸等级也可以是 wC hR
。
如果您想根据纵横比更改布局:
- 如果宽度 > 高度使用“横向”布局
- 如果高度 > 宽度使用“纵向”布局
您可能希望创建自己的约束集合并在 viewWillTransition(to size:...)
如果您想坚持使用 Trait 变体,您会在尝试为控制器的“根”视图操作它们时遇到问题。
您可以尝试使您的控制器成为子视图控制器,方法是将其嵌入到 UIContainerView
中或通过代码添加它,然后实现(在“父”视图控制器):
class ParentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let vc = storyboard?.instantiateViewController(withIdentifier: "myVC") as? MyRealViewController {
addChild(vc)
view.addSubview(vc.view)
vc.didMove(toParent: self)
}
}
override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection? {
if childViewController.view.bounds.width > childViewController.view.bounds.height {
let collections = [UITraitCollection(horizontalSizeClass: .regular),UITraitCollection(verticalSizeClass: .compact)]
return UITraitCollection(traitsFrom: collections)
}
return super.overrideTraitCollection(forChild: childViewController)
}
}