首页 > 解决方案 > 覆盖 ViewController 的 traitCollection

问题描述

默认情况下,iPad 在纵向或横向模式下的 traitCollection 为:宽度:常规,高度:常规

目标:我想为 iPad 纵向模式使用 Width: Compact 和 height:Regular traitCollection。

尝试解决方案:

override var traitCollection: UITraitCollection {
    if view.bounds.width < view.bounds.height {
        let traitCollection = [UITraitCollection(horizontalSizeClass: .compact), UITraitCollection(verticalSizeClass: .regular)]
        return UITraitCollection(traitsFrom: traitCollection)
    } else {
        let traitCollection = [UITraitCollection(horizontalSizeClass: .unspecified), UITraitCollection(verticalSizeClass: .unspecified)]
        return UITraitCollection(traitsFrom: traitCollection)
    }
    
}

问题:上面的代码似乎工作正常,我的 UI 会根据特定于相应特征的约束进行更改。但我在调试器中收到以下日志消息:

类 SizeClassDemo.ViewController 覆盖不支持的 -traitCollection getter。如果您尝试覆盖特征,则必须使用适当的 API。

第二种可能的解决方案:

override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection? {
    if view.bounds.width < view.bounds.height {
        let traitCollection = [UITraitCollection(horizontalSizeClass: .compact), UITraitCollection(verticalSizeClass: .regular)]
        return UITraitCollection(traitsFrom: traitCollection)
    } else {
        let traitCollection = [UITraitCollection(horizontalSizeClass: .unspecified), UITraitCollection(verticalSizeClass: .unspecified)]
        return UITraitCollection(traitsFrom: traitCollection)
    }
}

第二种解决方案的问题:

因此,为此,我需要将此代码放在父视图控制器上。因此,如果我在登录屏幕中没有父视图控制器,我需要将登录屏幕放在容器视图控制器中,然后将此方法放在父视图控制器的类中,这不是最佳解决方案。

问题:

我可以安全地忽略第一个解决方案的日志消息吗?有没有其他方法可以改变视图控制器的 traitCollection。

标签: iosswiftautolayoutuistoryboardsize-classes

解决方案


推荐阅读