Симулятор 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 не будет вызываться для последнего, поскольку обе ориентации будут "правильными".