2014-10-14 3 views
14

С iOS 8 и Xcode 6 в раскадровках теперь у нас есть сетка размера экрана, позволяющая выбрать класс размера. Где вы можете выбрать форматирование макета для разных размеров экрана.Установите AutoLayout Size Class Programmatically?

Я нашел это блестяще полезным, так как он позволяет мне устанавливать базовые ограничения, а затем уникальные для каждого размера экрана.

Вопрос в том, можете ли вы сделать это программно? Я создаю свой NSLayoutConstraint как обычно, но мне нужно указать различные ограничения для разных размеров экрана.

+2

Их называют классом размера. – rckoenes

+0

Спасибо, не знаю, как я это пропустил! Теперь, если бы был только способ программирования классов размера с помощью 'NSLayoutConstraint' или аналогичного. –

ответ

1

Это немного запутанно & трудно найти в документации, потому что «класс размера» на самом деле не является «классом», как NSObject. Они действительно определены в перечислении/ЬурейеЕ называется: UIUserInterfaceSizeClass

Способ получения горизонтального & вертикального класса размера для взгляд с методами UITraitCollection

Класс/тип для UITraitCollection позволяют создать на основе на определенной шкале отображения (например, сетчатки или нет), из массива других коллекций признаков, с идиомой UI (iPad/iPhone) или конкретным горизонтальным & вертикальными вариантами (компактными, регулярными), но, честно говоря, я не конечно же, как вы бы это использовали ...

This question обсуждает ограничения обновления, когда traitColle ction changes, используя willTransitionToTraitCollection(newCollection: UITraitCollection!, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!)

Вы правы, что UITraitCollection и его свойства читаются только, но, очевидно, вы можете создать новую коллекцию по какой-либо причине и обрабатывать изменения макета при изменении набора traitCollection.

This previous question очень похож & ссылки на статью Apple об использовании адаптивной компоновки. Также проверьте видео WWDC «Создание адаптивных приложений с помощью UIKit».

+0

У меня должно быть время, чтобы посмотреть видео WWDC завтра. Однако вы не можете установить свойство traitCollection ограничения вида или макета, только чтение. Итак, как бы вы применили ограничение для принадлежности к определенной коллекции признаков? Его интересное изменение, которое они принесли, мне это пока нравится. –

+0

Нашел и добавил связанный вопрос об изменении ограничений. Есть четкие методы для создания новых UITraitCollections и передачи их методам при просмотре 'willTransitionToTraitCollection' ... но я не играл с ним достаточно или смотрел видео в течение нескольких месяцев. Пора мне еще раз посмотреть! Для меня процесс и документация для Adaptive Layout довольно плохи и запутанны, учитывая, что это такая большая новая функция ... Подумайте об этом в конце концов! – mc01

12

iOS 8 представляет active недвижимость на NSLayoutConstraint. Это позволяет вам активировать или деактивировать ограничение. Существуют также способы активировать/деактивировать несколько ограничений.

+ (void)activateConstraints:(NSArray *)constraints 
+ (void)deactivateConstraints:(NSArray *)constraints 
  • Держите ваши ограничения в массивах при их создании программно.
  • Создайте массив для каждого из макетов, в котором вы нуждаетесь.
  • Включение/выключение любой набор ограничений вам нужно внутри willTransitionToTraitCollection
+0

Спасибо, но, может быть, в 2017 году есть другой путь? –

1

Чтобы ответить на ваш вопрос, вы можете установить класс размера программно, однако, это немного боли. Вы должны называть «setOverrideTraitCollection», но из родительского контроллера представления, а не того, на котором вы действительно хотели изменить значение.

В моей ситуации я хотел изменить Master VC контроллера разделенного вида на iPad, чтобы выглядеть по-другому, чем тот, который есть на iPhone, однако они по умолчанию установлены на Compact width/Regular height. Поэтому я подклассифицировал навигационный контроллер мастера и добавил код, чтобы установить черты мастера на обычную ширину, когда это не iPhone.

Swift код:

class MasterNavigationController: UINavigationController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     if (self.traitCollection.userInterfaceIdiom != .Phone) { 
      let newTraitCollection = UITraitCollection(horizontalSizeClass: .Regular) 
      self.setOverrideTraitCollection(newTraitCollection, forChildViewController: self.topViewController) 
     } 
    } 

} 

Я надеюсь, что это помогает кто-то ищет подобное решение.

+0

Вы задаете класс размера вручную, но что делать с ранее объявленными ограничениями? Как правильно определить, какой признак они принадлежат? –

+0

Ограничения устанавливаются для каждого класса размера в раскадровке (с использованием значков устройства внизу). Вот видео от WWDC 2016, где они рассказывают, как это изменилось недавно. https://developer.apple.com/videos/play/wwdc2016/236/ –

+0

Я знаю о раскадровке, но вопрос касался ограничений, объявленных программным путем –

Смежные вопросы