UISplitViewController - 防止iPhone 6 plus上的横向分割

时间:2016-06-21 17:36:38

标签: ios uisplitviewcontroller iphone-6-plus

我在我的应用中使用了UISplitViewController。这在iPad上可以很好地工作,其中主要和次要总是可见的,并且它在大多数iPhone上工作得很好,它就像UINavigationController一样。

在iPhone 6+和6S +上,分割视图就像是纵向的iPhone,就像风景中的iPad一样。这种景观分裂导致了我的问题,我想避免它。

有没有办法阻止UISplitViewController在iPhone 6+环境中显示主控制器和辅助控制器?我只是想让它显示辅助控制器,就像它对其他iPhone一样。

感谢。

3 个答案:

答案 0 :(得分:3)

我能够通过继承UISplitViewController然后覆盖特征集合来执行此操作,以在设备不是iPad时返回紧凑的水平尺寸类。我知道现在检查界面成语是一种失礼,但我不知道该怎么做。

我只是将这个方法添加到我的UISplitViewController子类中:

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

任何有关更好方法的建议当然是受欢迎的。

答案 1 :(得分:2)

以下是Swift中的相同答案,但也有一个修复,其中垂直尺寸类在手机横向错误:

if($(this).is(':first-child')) {
      $(this).addClass("success");
}

答案 2 :(得分:1)

我在UINavigationControllers上无法正确显示上述代码时遇到了一些问题。这是对我有用的方法(快速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
    }
}