2

我正在traitCollectionDidChange(_)更新我的紧凑和常规约束。当我通过旋转约束在设备上进行测试时,会正确更新。但是,当我尝试在模拟器中测试相同的代码时,什么也没有发生。我插入了打印语句,我可以看到在模拟器旋转时没有任何反应。这是一个错误,还是我需要为模拟器做一些特别的事情?

提前致谢。我正在使用 Xcode 8.2.1 顺便说一句。

这是我的代码:

    private var compactConstraints: [NSLayoutConstraint] = []
    private var regularConstraints: [NSLayoutConstraint] = []
    private var sharedConstraints: [NSLayoutConstraint] = []
    ...
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

        super.traitCollectionDidChange(previousTraitCollection)

        if (!sharedConstraints[0].isActive) {
            // activating shared constraints
            NSLayoutConstraint.activate(sharedConstraints)
        }


        if (self.traitCollection.containsTraits(in: UITraitCollection(horizontalSizeClass: UIUserInterfaceSizeClass.compact))) {

            print("going to activate: compact")
            if regularConstraints.count > 0 && regularConstraints[0].isActive {
                NSLayoutConstraint.deactivate(regularConstraints)
            }
            // activating compact constraints
            NSLayoutConstraint.activate(compactConstraints)
        } else {
            print("going to activate: regular")
            if compactConstraints.count > 0 && compactConstraints[0].isActive {
                NSLayoutConstraint.deactivate(compactConstraints)
            }
            // activating regular constraints
            NSLayoutConstraint.activate(regularConstraints)
        }

    }

控制台输出如下:

[launch app]
`going to activate: compact`
[rotate the simulator with ⌘ arrow key]
`going to activate: compact`

基于hoshy的问题的小更新:我正在将模拟器与 iPhone 设备一起使用。特别是 iPhone SE。

4

2 回答 2

2

horizontalSizeClass适用Compact于两个方向。verticalSizeClass适用regularportraitiPhone SE Compactlandscape您可以更改此行

if (traitCollection.containsTraits(in: UITraitCollection(verticalSizeClass: .compact))) {

或者干脆

if traitCollection.verticalSizeClass == .compact {

viewWillTransitionToSize:withTransitionCoordinator:如果您正在寻找与尺寸更改动画一起运行的动画,您也可以使用。

从苹果开发者那里构建一个自适应界面

如果您的 Auto Layout 约束不足以实现您想要的外观,您可以使用该 viewWillTransitionToSize:withTransitionCoordinator:方法对您的布局进行更改。您还可以使用该方法创建其他动画以与尺寸更改动画一起运行。例如,在界面旋转期间,您可以使用转换协调器的 targetTransform 属性为界面的某些部分创建反向旋转矩阵。

于 2017-01-23T11:30:38.463 回答
0

会不会是你的实际测试设备是 iPhone 而你的模拟器是 iPad?不会在后者上调用 traitCollectionDidChange 方法,因为两个方向都是“常规的”。

于 2017-01-21T13:20:17.487 回答