iPad 上的 UITraitCollection 和 UISplitViewController

Posted

技术标签:

【中文标题】iPad 上的 UITraitCollection 和 UISplitViewController【英文标题】:UITraitCollection and UISplitViewController on iPad 【发布时间】:2016-04-05 21:13:58 【问题描述】:

我正在使用UISplitViewController 设计一个 iPad 应用程序。我已经配置了UISplitViewController,这样主视图控制器(即左侧较薄的视图)始终可以通过splitViewController.preferredDisplayMode = .AllVisible 看到。

详细视图控制器是UICollectionView,我想根据 iPad 是纵向还是横向来更改它的显示方式。如果是纵向,我会让集合视图只显示一列(类似于UITableView)。如果它是横向的,有更多可用的水平屏幕空间,那么我将显示多个列。我想我可以在实现该集合视图的数据源和委托的类中使用一些条件来做到这一点。

我不想只检查设备的方向,因为我更喜欢使用尺寸类和特征,以便应用程序也可以在 iPhone 等设备上运行(遇到相同的特征时)。

我知道每个视图控制器都有一个traitCollection 属性,但是当我在viewDidAppear 方法中打印出这个属性时,无论iPad 的初始方向如何,它总是说视图控制器是_UITraitNameHorizontalSizeClass = Compact, _UITraitNameVerticalSizeClass = Regular

如果 iPad 是纵向的,我会预料到这一点,但即使它最初是横向的,也会打印出来 - 尽管我希望水平和垂直尺寸类的方向是 RegularRegular

此外,如果我在视图控制器中实现 traitCollectionDidChange: 方法,它永远不会在旋转时调用,或者即使点击详细视图控制器上的展开按钮以隐藏主视图控制器(并为详细视图控制器提供完整的屏幕)。

所以,我的问题是如何在拆分视图控制器中检测视图控制器中的大小类/特征变化......还是我这样做完全错了?

就响应中的任何示例代码而言,该应用是用面向 ios 9 的 Swift 编写的。

提前感谢您的帮助!

【问题讨论】:

您好,您找到解决方案了吗? 很遗憾,还没有,但我将在下周做更多的工作。 【参考方案1】:

也许您可以尝试使用以下方法检查traitCollectionself.splitViewController

private var isCompactOrientation: Bool 
    get 
        return self.splitViewController?.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact
    

如果使用self.traitCollection.horizontalSizeClass,它总是返回.Compact

【讨论】:

原始行为必须是拆分将其第二列的特征集合和主列的紧凑水平。我认为你的猜测是错误的。在此 URL 的末尾:commandshift.co.uk/blog/2016/04/11/…

以上是关于iPad 上的 UITraitCollection 和 UISplitViewController的主要内容,如果未能解决你的问题,请参考以下文章

使用具有水平紧凑 UITraitCollection 的自定义 UIPresentationController,否则会弹出一个

如何覆盖尺寸等级?

iPad 3(或新 iPad)上的 CSS 媒体查询

iPad、iPad 2 上的边框半径问题

即使 iPad 处于纵向模式,如何强制 iPad 上的电视处于横向模式

iPad 上的 MPMoviePlayerController 问题