Стиль ограничения iOS: addConstraints vs .isActive = true

#ios #swift #autolayout #nslayoutconstraint

#iOS #swift #автоматическое описание #nslayoutconstraint

Вопрос:

У меня есть некоторый код, который программно создает ограничения автоматической компоновки и добавляет их в представление.

Есть два способа сделать это — вызвать addConstraints супервизор или установить .isActive = true для каждого ограничения (которое внутренне вызывает addConstraint)

Вариант 1:

 parent.addConstraints([
    child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20),
    child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5) ])
  

Вариант 2:

 child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20).isActive = true
child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5).isActive = true
  

Мой вопрос в том, есть ли какая-либо польза от выполнения одного над другим? (производительность / и т. Д.) Или это сводится исключительно к стилю.

(Я не думаю, что ограничения оцениваются до следующего прохода макета, поэтому я не думаю, что должно иметь значение, что мы добавляем их по одному, а не в блок ??)

Если это просто стиль, какой стиль «более предпочтителен» сообществом??

(лично я предпочитаю addConstraints, однако он очень близок, и на меня можно легко повлиять.Является активным)

Ответ №1:

Согласно документации по addConstraint: настройке active свойства рекомендуется для отдельных ограничений. (примечание: active свойство доступно только для iOS 8 ).

При разработке для iOS 8.0 или более поздней версии установите для активного свойства ограничения значение YES вместо прямого вызова метода addConstraint: . Свойство active автоматически добавляет и удаляет ограничение из правильного представления. (ссылка)

Также, если вы посмотрите на определение интерфейса, для addConstraint: него есть этот комментарий:

// Этот метод устареет в будущей версии, и его следует избегать. Вместо этого установите для активного свойства NSLayoutConstraint значение YES


С учетом сказанного, на самом деле существует 3-я [и, вероятно, лучшая] альтернатива, которая заключается в использовании NSLayoutConstraint метода класса activate: :

 NSLayoutConstraint.activate([
    child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20),
    child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5) ])
  

Это также рекомендуемое решение в соответствии с документацией и файлами интерфейса. Итак, если у вас есть несколько ограничений, это было бы простым решением и, вероятно, предпочтительнее в вашей ситуации.

(комментарий к интерфейсу; выделение мое):

Удобный метод, который активирует каждое ограничение в содержащемся массиве таким же образом, как и установка active=YES . Это часто более эффективно, чем активировать каждое ограничение по отдельности.

Комментарии:

1. Кстати, похоже, что «activateConstraints» был переименован в «активировать»: developer.apple.com/reference/uikit/nslayoutconstraint /…

2. Спасибо, что поняли это! Я обновил его. На будущее, не стесняйтесь просто редактировать ответ самостоятельно: D. Еще раз спасибо!