Ios 强制UISplitViewController始终(仅)在横向视图中显示master(在iPhone 6 Plus上)
在一个通用的应用程序中,我找不到一种方法来始终显示(并且只显示)主控制器,即使是在iPhone6Plus的横向旋转中 我想实现的是只在iPad上看到UISplitViewController的运行,而不是在iPhone上,我不知道这是否可行 委托方法没有帮助:Ios 强制UISplitViewController始终(仅)在横向视图中显示master(在iPhone 6 Plus上),ios,iphone,swift,ipad,uisplitviewcontroller,Ios,Iphone,Swift,Ipad,Uisplitviewcontroller,在一个通用的应用程序中,我找不到一种方法来始终显示(并且只显示)主控制器,即使是在iPhone6Plus的横向旋转中 我想实现的是只在iPad上看到UISplitViewController的运行,而不是在iPhone上,我不知道这是否可行 委托方法没有帮助: func splitViewController(svc: UISplitViewController, shouldHideViewController vc: UIViewController, inOrientation orien
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
}
您需要重写UISplitViewController的trait集合,以始终具有紧凑大小的类。为此,需要插入一个容器视图控制器作为UISplitViewController的父级:
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)
}
}}
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)
}
}}
特里的答案解释得很好!此处更新为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上遇到问题的确切情况的信息,谢谢。另外,第一个代码段缺少对super的调用,super在子视图控制器上调用了相同的方法。有没有办法使其成为动态的?例如,初始主视图控制器全屏显示,但在下一个屏幕中显示详细视图控制器?