Симулятор XCode не вызывает traitCollectionDidChange

Я переопределяю 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.

2 ответа

Решение

horizontalSizeClass является Compact для обеих ориентаций. verticalSizeClass является regular за portrait а также Compact за landscape для iPhone SE. Вы можете изменить эту строку

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

или просто

if traitCollection.verticalSizeClass == .compact {

Вы также можете использовать viewWillTransitionToSize:withTransitionCoordinator: если вы ищете анимацию для запуска вместе с анимацией изменения размера.

Создание адаптивного интерфейса от разработчика Apple

Если ограничения Auto Layout недостаточны для достижения желаемого вида, вы можете использовать viewWillTransitionToSize:withTransitionCoordinator: способ внести изменения в ваш макет. Вы также можете использовать этот метод для создания дополнительных анимаций, которые будут выполняться вместе с анимациями изменения размера. Например, во время ротации интерфейса вы можете использовать свойство targetTransform координатора перехода, чтобы создать матрицу встречного вращения для частей вашего интерфейса.

Может ли быть, что ваше настоящее тестовое устройство - iPhone, а симулятор - iPad? Метод traitCollectionDidChange не будет вызываться для последнего, поскольку обе ориентации будут "правильными".

Другие вопросы по тегам