强制 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 一致分隔符

UISplitViewController - 并排或纵向叠加

在 UIViewControllers 和 UISplitViewController 之间导航 [关闭]

将 UIToolBar 放在 UISplitViewController 上方?