Xcode模拟器不调用traitCollectionDidChange

时间:2017-01-20 20:03:29

标签: swift3 ios-simulator xcode8 screen-rotation uitraitcollection

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

提前致谢。我正在使用Xcode 8.2.1 btw。

这是我的代码:

    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。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

两个方向的

horizontalSizeClass均为Compact。对于iPhone SE,verticalSizeClass regularportraitCompactlandscape。你可以改变这一行

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

或只是

if traitCollection.verticalSizeClass == .compact {

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

来自apple developer的

Building an Adaptive Interface

  

如果您的自动布局限制不足以实现外观   你想要的,你可以使用   viewWillTransitionToSize:withTransitionCoordinator:方法   更改您的布局。您也可以使用该方法进行创建   与尺寸变化动画一起运行的其他动画。对于   例如,在界面旋转期间,您可以使用转换   协调器的targetTransform属性用于创建反向旋转   接口部分的矩阵。