Свойства UIStackView в соответствии с размерными классами

Я пытаюсь протестировать UIStackView в раскадровке, где я изменяю свойство «Ось» в зависимости от ориентации iPhone (wAny/hC, wC/hR).

К сожалению, при запуске изменение не применяется. В частности, свойство «Ось» изменено (проверено в Xcode), но макет не изменится.

Спасибо заранее за вашу помощь.


person Olivier31    schedule 15.06.2015    source источник
comment
это может немного помочь «как использовать представление стека библиотеки объектов в xcode 7»> stackoverflow.com/questions/30779724/   -  person Anish Parajuli 웃    schedule 15.06.2015
comment
Спасибо, это похоже на ошибку: forums.developer.apple.com/thread /5263?q=uista   -  person Olivier31    schedule 16.06.2015
comment
Да, у меня тоже была эта проблема (выше мой пост :)), и это подтвердил другой участник форума, который поднял рдар. Хотя я не могу найти ошибку, которую он поднял ... Также я заметил, что ручное изменение axis в обратных вызовах коллекции признаков также не работает ... Обратите внимание, что это нормально при использовании Split View на iPad!   -  person Rich    schedule 17.06.2015
comment
Рич, изменение оси в обратных вызовах коллекции признаков работает, если вы отправляете ее в основную очередь: dispatch_async(dispatch_get_main_queue()) { ... }   -  person Olivier31    schedule 18.06.2015


Ответы (1)


Это определенно ошибка. Поведение оси во время выполнения (симулятор или устройство) после более тщательного изучения меняется только для каждого другого 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