Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 强制UISplitViewController始终(仅)在横向视图中显示master(在iPhone 6 Plus上)_Ios_Iphone_Swift_Ipad_Uisplitviewcontroller - Fatal编程技术网

Ios 强制UISplitViewController始终(仅)在横向视图中显示master(在iPhone 6 Plus上)

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

在一个通用的应用程序中,我找不到一种方法来始终显示(并且只显示)主控制器,即使是在iPhone6Plus的横向旋转中

我想实现的是只在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
    }

您需要重写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)
    }
}}
  • 将UISplitViewController嵌入到ContainerViewController中
  • 将以下代码添加到容器视图控制器子类中,以覆盖子视图控制器的trait集合:

    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在子视图控制器上调用了相同的方法。有没有办法使其成为动态的?例如,初始主视图控制器全屏显示,但在下一个屏幕中显示详细视图控制器?