强制 UISplitViewController 始终以横向显示主视图(仅)(在 iPhone 6 Plus 上)
Posted
技术标签:
【中文标题】强制 UISplitViewController 始终以横向显示主视图(仅)(在 iPhone 6 Plus 上)【英文标题】:Force UISplitViewController to always show master (only) in landscape (on iPhone 6 Plus) 【发布时间】:2016-02-29 17:37:19 【问题描述】:在通用应用程序中,我找不到始终显示(且仅显示)主控制器的方法,即使在 iPhone 6 Plus 横向旋转时也是如此。
我想要实现的是只在 iPad 上而不是在 iPhone 上看到 UISplitViewController 的作用,不知道是否有可能
委托方法没有帮助:
func splitViewController(svc: UISplitViewController, shouldHideViewController vc: UIViewController, inOrientation orientation: UIInterfaceOrientation) -> Bool
return false
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool
return true
【问题讨论】:
【参考方案1】:您需要覆盖 UISplitViewController 的 trait 集合以始终拥有一个紧凑大小的类。为此,您需要插入一个容器视图控制器作为 UISplitViewController 的父级:
-
将 UISplitViewController 嵌入到 ContainerViewController 中
将以下代码添加到容器视图控制器子类中以覆盖子视图控制器的特征集合:
class ContainerVC: UIViewController
override func viewDidLoad()
super.viewDidLoad()
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
performOverrideTraitCollection()
private func performOverrideTraitCollection()
for childVC in self.childViewControllers
setOverrideTraitCollection(UITraitCollection(horizontalSizeClass: .Compact), forChildViewController: childVC)
Building Adaptive Apps with UIKit (WWDC 2014)中的精彩解释
【讨论】:
【参考方案2】:特里的回答效果很好!在这里它更新到 Swift 5 并且只能在 iPhone 设备上工作,而不是 iPad:
class ContainerVC: UIViewController
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
if UI_USER_INTERFACE_IDIOM() != .pad
performOverrideTraitCollection()
private func performOverrideTraitCollection()
for childVC in self.children
setOverrideTraitCollection(UITraitCollection(horizontalSizeClass: .compact), forChild: childVC)
iOS 13 更新
以上代码不再适用于 ios 13。请在 ContainerVC 类中改用以下代码:
override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection?
if UIDevice.current.userInterfaceIdiom != .pad
return UITraitCollection(horizontalSizeClass: .compact)
else
return super.traitCollection
【讨论】:
有兴趣了解有关您在 iOS 13 上遇到问题的具体情况的更多信息,谢谢。此外,第一个 sn-p 缺少对 super 的调用,这是在子视图控制器上调用相同方法的原因。 有没有办法让它动态化?例如让初始主视图控制器全屏显示,但在下一个显示详细视图控制器?以上是关于强制 UISplitViewController 始终以横向显示主视图(仅)(在 iPhone 6 Plus 上)的主要内容,如果未能解决你的问题,请参考以下文章
UISplitviewController 和不同的 UIKeyCommands 取决于主、细节或两者都在屏幕上
UISplitViewController - 双列样式不起作用
UISplitViewController - 并排或纵向叠加