#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. Еще раз спасибо!