UISplitViewController - 如何在 iPhone 6 Plus 的横屏模式下防止分屏?

4
我在我的应用程序中使用了UISplitViewController。在iPad上,主要和次要视图控制器始终可见,这很正常,在大多数iPhone上也能正常工作,就像一个UINavigationController一样。
但是在 iPhone 6+ 和 6S+ 上,分割视图在纵向模式下的显示方式类似于iPhone,在横向模式下则类似于iPad。这种在横屏时的拆分会给我带来问题,而我想避免它。
有没有办法阻止UISplitViewController在 iPhone 6+ 横屏时显示主要和次要视图控制器?我只希望它向其他iPhone一样仅显示次要视图控制器。
谢谢。
3个回答

3

我通过子类化UISplitViewController并覆盖trait collection,以便在设备不是iPad时返回紧凑的水平大小类来实现这一点。我知道检查界面习惯现在已经过时了,但我不确定还有其他方法。

我只需将此方法添加到我的UISplitViewController子类中:

-(UITraitCollection *)traitCollection {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return [super traitCollection];
    } else {
        return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    }
}

如果您有更好的方法,请不吝赐教。


这个有什么对应的 Swift 方法吗?我只能找到 overrideTraitCollectionForChildViewController - bachman
看起来这个解决方案有些靠不住。它覆盖了在UITraitEnvironment协议中声明的必需属性,该协议由UIViewController实现。它基本上是覆盖了traitCollection属性的“getter”方法。不确定你如何在Swift中做到这一点。 - TylerJames

2

我曾经遇到过使用以上代码时UINavigationControllers无法正确显示的问题。以下是适用于我的方法(Swift 5):

1)创建一个包含UIContainerView的UIViewController

2)将您的UISplitViewController嵌入该容器中

3)添加以下代码:

最初的回答:

class SplitViewContainerViewController: 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)
        }
    }
}

4) 将包含容器视图的视图控制器设置为SplitViewContainerViewController

iOS 13更新

上述代码在iOS 13上不再适用。改为在SplitViewContainerViewController类上使用以下代码:

override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection? {
    if UIDevice.current.userInterfaceIdiom != .pad {
        return UITraitCollection(horizontalSizeClass: .compact)
    } else {
        return super.traitCollection
    }
}

2

以下是相同的答案,但使用Swift编写,并修复了在横向时手机上垂直大小类别错误的问题:

override var traitCollection: UITraitCollection {
    if UI_USER_INTERFACE_IDIOM() == .pad {
            return super.traitCollection
    } else {
        let horizontal = UITraitCollection(horizontalSizeClass: .compact)
        let vertical = UITraitCollection(verticalSizeClass: super.traitCollection.verticalSizeClass)
        return UITraitCollection.init(traitsFrom: [horizontal, vertical])
    }
}

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