Это определенно ошибка. Поведение оси во время выполнения (симулятор или устройство) после более тщательного изучения меняется только для каждого другого UIStackView в иерархии представлений.
Я не пробовал все возможные перестановки, но это то, что я обнаружил, поскольку проблема возникла только после того, как я захотел ввести более одного представления стека с этим желаемым поведением изменения оси. Могут быть случаи, когда одно представление стека не подчиняется правилу размера класса, но я не воспроизвел это надежно.
Посмотрите мой проект для iOS 9.1, который наглядно демонстрирует эту проблему с 8 элементами UIStackView в вертикальном расположении. Все они настроены точно одинаково, за исключением того, что их положение ограничено относительно друг друга и верхней части экрана.
Как вы можете видеть из предварительного просмотра раскадровки, все выглядит так, как мы хотим и ожидаем в ландшафте:

Другое дело, когда вы работаете на симуляторе или устройстве. После экспериментов со многими представлениями стека становится очевидным, что ошибка затрагивает все другие представления стека в иерархии представлений.

Я поднял свой собственный отдельный RDAR с этим примером проекта, несмотря на то, что слышал упоминание о другом в комментариях выше. Я не смог найти общедоступную запись об этом.
По-видимому, существует обходной путь на основе кода, который является болезненным и полностью противоречит цели авторазметки, ограничений и классов размеров. Для меня это довольно серьезная ошибка, поскольку она устраняет довольно важный вариант использования для представлений стека и классов размеров.
Обходной путь кода согласно сообщению на форумах разработчиков Apple:
Кстати: переопределение viewWillTransitionToSize и ручная установка различных параметров решает проблему, но это довольно утомительно, так как нам также нужно проверять представление в коде, что должно быть связано исключительно с дизайном.
В случае, если это не совсем ясно, вам нужно иметь ссылку IBOutlet на несовместное представление стека и, возможно, представление, которое оно заполняет в вашем коде контроллера представления. Вы можете изменить свойство оси представления стека и, в идеале, высоту того, что оно содержит:
@IBOutlet weak var viewHackStack: UIView!
@IBOutlet weak var hackStackView: UIStackView!
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if(self.traitCollection.verticalSizeClass == .Compact) {
self.viewHackStack.frame.size.height = 25
self.hackStackView.axis = .Horizontal
}
else if(self.traitCollection.verticalSizeClass == .Regular) {
self.viewHackStack.frame.size.height = 50
self.hackStackView.axis = .Vertical
}
}
Если вы хотите быть более конкретным с классом размера, который определяет изменение поведения, просто поэкспериментируйте с типами классов размера набора признаков, пока не выполните желаемое условие.
Если я узнаю что-нибудь о графике исправления ошибок, я опубликую это здесь. До тех пор, я надеюсь, что это поможет в качестве обходного пути.
person
forgo
schedule
29.10.2015
axisв обратных вызовах коллекции признаков также не работает ... Обратите внимание, что это нормально при использовании Split View на iPad! - person Rich   schedule 17.06.2015dispatch_async(dispatch_get_main_queue()) { ... }- person Olivier31   schedule 18.06.2015