UITraitCollection 是在 IB/Storyboard 中具有差异 iPad 横向与纵向自动布局的途径吗
Is UITraitsCollection the path to having diff iPad Landscape vs Portrait AutoLayout in IB/Storyboard
提问:
我想在 iPad 上使用不同的纵向和横向布局。 (我在 iPhone 上取得了成功,但是 iPad 大小相似 类)
我有什么done/Tried:
通过 Google 和 SO 阅读和搜索,我还没有找到解决方案。我学到的是关于覆盖 UITraitsCollection
并且如果可能的话,我想强制 iPad 横向配置遵循我已经为 iPhone 横向模式设置的相同配置使用 hCompact
我试过这个解决方案 但不确定将它放在哪里,当它刚放在 UIViewController
中时,当 运行 时,应用程序甚至不调用它。 (这可能是因为我在 childViewController 中没有我的视图?)
这里的 post 也引用了 UITraitsCollection
但是缺少示例。
我相当确定这是许多应用程序正在做的事情,但我找不到解决方案。
供参考:这也是我想在 iPad 上实现的。 (iPhone 使用@DonMag 的这个解决方案效果很好)
由于设备屏幕纵横比不同,和 iPad 上的多任务处理能力,我们鼓励您考虑尺寸不是方向。
如果您的应用 运行 带有侧拉/拆分视图,即使设备处于“横向”,尺寸 class 也可以 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)
}
}
提问: 我想在 iPad 上使用不同的纵向和横向布局。 (我在 iPhone 上取得了成功,但是 iPad 大小相似 类)
我有什么done/Tried:
通过 Google 和 SO 阅读和搜索,我还没有找到解决方案。我学到的是关于覆盖 UITraitsCollection
并且如果可能的话,我想强制 iPad 横向配置遵循我已经为 iPhone 横向模式设置的相同配置使用 hCompact
我试过这个解决方案 但不确定将它放在哪里,当它刚放在 UIViewController
中时,当 运行 时,应用程序甚至不调用它。 (这可能是因为我在 childViewController 中没有我的视图?)
这里的 post 也引用了 UITraitsCollection
但是缺少示例。
我相当确定这是许多应用程序正在做的事情,但我找不到解决方案。
供参考:这也是我想在 iPad 上实现的。 (iPhone 使用@DonMag 的这个解决方案效果很好)
由于设备屏幕纵横比不同,和 iPad 上的多任务处理能力,我们鼓励您考虑尺寸不是方向。
如果您的应用 运行 带有侧拉/拆分视图,即使设备处于“横向”,尺寸 class 也可以 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)
}
}