首页 > 解决方案 > iphone X 的 TraitCollectionDidChange 行为不同

问题描述

在我的情况下,我根据 traitCollection.horizo​​ntalSizeClass 更改视图的布局这是我的代码片段。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if traitCollection.horizontalSizeClass == .regular {
            // 2
            NSLayoutConstraint.deactivate(compactConstraints)
            NSLayoutConstraint.activate(regularConstraints)
            // 3
            socialMediaView.axis = .horizontal
        } else {
            // 4
            NSLayoutConstraint.deactivate(regularConstraints)
            NSLayoutConstraint.activate(compactConstraints)
            socialMediaView.axis = .vertical
        }
    }

iphone 7 plusiphone x的纵向模式 Screen_Shot_2018-08-07_at_1.44.54_PM.png 和横向模式下,每件事情都按照指示
工作手机 7 来了。查看以下屏幕截图 Screen_Shot_2018-08-07_at_1.32.02_PM.png

标签: swiftautolayoutlandscape-portraitsize-classes

解决方案


查看您的问题和状况,我发现您的状况有问题。您应该检查verticalSizeClass而不是horizo​​ntalSizeClass。

当检查水平尺寸等级时。

IN PORTRAIT:所有 iPhone 设备都有紧凑的宽度,所以每次都会进入 else 条件并正确设置视图。

在风景中:所有 iPhone Plus (iPhone 6s Plus、iPhone 7 Plus 和 iPhone 8 plus)设备具有常规宽度,所有其他 iPhone (iPhone 6s、6SE、iPhone 7 和 iPhone 8、iPhone X)设备具有紧凑宽度,因此对于所有加上设备,它可以正常工作,但不适用于其他设备。

肖像: 肖像

景观: 景观

有关更多信息,请在此处阅读官方文档

因此,将您的代码更新为此。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if traitCollection.verticalSizeClass == .regular {
            NSLayoutConstraint.deactivate(compactConstraints)
            NSLayoutConstraint.activate(regularConstraints)
            socialMediaView.axis = .horizontal
        } else {
            NSLayoutConstraint.deactivate(regularConstraints)
            NSLayoutConstraint.activate(compactConstraints)
            socialMediaView.axis = .vertical
        }
    }

尝试并分享结果。


推荐阅读