簡體   English   中英

強制UISplitViewController始終以橫向顯示主(僅限)(在iPhone 6 Plus上)

[英]Force UISplitViewController to always show master (only) in landscape (on iPhone 6 Plus)

在通用應用程序中,我無法找到始終顯示(並且僅)主控制器的方法,即使在橫向旋轉的iPhone 6 Plus上也是如此。

我想要實現的是看到UISplitViewController僅在iPad上運行而不在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
    }

您需要覆蓋UISplitViewController的特征集合,以便始終具有緊湊的大小類。 為此,您需要插入容器視圖控制器作為UISplitViewController的父級:

  1. 將UISplitViewController嵌入到ContainerViewController中
  2. 將以下代碼添加到容器視圖控制器子類中以覆蓋子視圖控制器的特征集合:

     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)

特里的回答非常好! 這里更新為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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM