【问题标题】:UISplitViewController - prevent splitting in landscape on iPhone 6 plusUISplitViewController - 防止在 iPhone 6 plus 上横向分割
【发布时间】:2016-06-21 17:36:37
【问题描述】:

我在我的应用程序中使用 UISplitViewController。这在主要和次要始终可见的 iPad 上运行良好,并且在其作用类似于 UINavigationController 的大多数 iPhone 上运行良好。

在 iPhone 6+ 和 6S+ 上,拆分视图的作用类似于 iPhone 的纵向和 iPad 的横向。这种横向分割给我带来了问题,我想避免它。

有什么方法可以防止 UISplitViewController 在 iPhone 6+ 横向显示主要和次要控制器?我只希望它显示辅助控制器,就像其他 iPhone 一样。

谢谢。

【问题讨论】:

    标签: ios uisplitviewcontroller iphone-6-plus


    【解决方案1】:

    当设备不是 iPad 时,我可以通过继承 UISplitViewController 然后重写 trait 集合来返回一个紧凑的水平尺寸类来做到这一点。我知道这些天检查界面习语是一种错误,但我不知道该怎么做。

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

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

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

    【讨论】:

    • 什么是快速的等效方法?我只能找到overrideTraitCollectionForChildViewController
    • 似乎是一个粗略的解决方案。它覆盖了在 UITraitEnvironment 协议中声明的必需属性,该协议由 UIViewController 实现。它基本上覆盖了 traitCollection 属性的“getter”方法。不知道你是如何在 Swift 中做这种事情的。
    【解决方案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])
        }
    }
    

    【讨论】:

      【解决方案3】:

      我遇到了一些 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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        相关资源
        最近更新 更多