强制 UISplitViewController 在横屏时(iPhone 6 Plus 上)始终仅显示主视图控制器

3
在通用应用程序中,我找不到一种始终显示(并且仅显示)主控制器的方法,即使在iPhone 6 Plus横向旋转时也是如此。我想要实现的是仅在iPad上看到UISplitViewController,并且不在iPhone上看到,不知道是否可能。委托方法没有帮助:
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
    }
2个回答

6

您需要覆盖 UISplitViewController 的 trait collection 以始终具有紧凑的尺寸类。为此,您需要将容器视图控制器插入作为 UISplitViewController 的父级:

  1. Embed your UISplitViewController into a ContainerViewController
  2. Add the following code into your container view controller subclass to override the trait collection of your child view controller:

    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)
        }
    }}
    

使用UIKit构建自适应应用程序(WWDC 2014)中有很好的解释。


0
Terry的答案非常好!这是更新为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的调用,这正是调用子视图控制器上相同方法的方法。 - malhal
有没有办法使它变得动态?例如,初始主视图控制器全屏显示,但在下一个视图控制器中显示详细信息? - Jeffrey Chang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接