Подтвердить что ты не робот

Включение/отключение NSLayoutConstraints в интерфейсеBuilder

NSLayoutConstraintiOS 8.0) имеет свойство BOOL, называемое active, что позволяет легко отключить/включить указанное ограничение макета на лету.

Чтобы создать второй набор макетов для контроллера представления, который затем я могу программно включить/отключить (через IBOutletCollection of NSLayoutConstraints для обоих наборов), мне нужно отключить мои уже определенные ограничения макета в построителе интерфейса,

Позвольте мне пояснить здесь, я НЕ хочу их удалять, просто отключите их, чтобы я мог спроектировать второй набор без конструктора интерфейса, который все время жаловался на несоответствующие ограничения. Кроме того, классы классов переключения не являются опцией, поскольку наборы макетов предназначены для одного и того же класса размера.

Есть ли возможность сделать это?

Спасибо в Advance

Малте

Дополнительная информация: SDK Version: 8.1 Deployment Target 8.0

4b9b3361

Ответ 1

Выберите ограничение, которое вы хотите отключить в раскадровке, и Option + Command + 4, чтобы отобразить инспектор атрибутов, затем снимите флажок Installed.

Ответ 2

Я ранее использовал решение, предоставляемое Gabbler, но недавно я попробовал то же самое с помощью Swift 2.0 и Xcode 7 и обнаружил, что он больше не работает. Ограничения, которые были установлены как не установленные, как и следовало ожидать, не были установлены вообще и не влияли на компоновку при включении или выключении.

Мое решение проблемы состояло в том, чтобы убедиться, что все ограничения были установлены и добавить определяемый пользователем атрибут runtime с ключом "active", введите "boolean" и значение "false".

Пользовательскую панель атрибутов времени выполнения можно найти в Инспекторе удостоверений под полями пользовательского класса.

Ответ 3

Мое решение, использующее Xcode 8 и Swift 3 без получения каких-либо предупреждений, было снято с флажка "Установлено" в построителе интерфейса, вкладке "Инспектор":

Установленное поле в построителе интерфейса

Затем создайте IBOutlets и добавьте/удалите их программно на viewDidLayoutSubviews()

view.removeConstraints([constraints to remove, ...])
view.addConstraints([constraints to add, ...])

Обязательно сначала удалите ограничения, иначе вы получите журнал сообщений Невозможно одновременно удовлетворить ограничения...

Ответ 4

В этом конкретном случае я объявляю свои ограничения в коде.

// Card View Animatable Constraints
private lazy var cardViewHeightConstraint: NSLayoutConstraint = cardView.heightAnchor.constraint(equalToConstant: 500)
private lazy var cardViewEqualHeightConstraint: NSLayoutConstraint = cardView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.8)

Затем вы можете активировать или деактивировать их, когда захотите.

override func viewDidLoad() {
    super.viewDidLoad()

    cardViewHeightConstraint.isActive = true
    cardViewEqualHeightConstraint.isActive = false
}

И вы все еще можете сделать большую часть своего макета в построителе интерфейса. Вы можете установить ограничение, которое будет удалено во время выполнения, чтобы Interface Builder по-прежнему отражал внешний вид ваших макетов (или хотя бы один из них). Просто создайте ограничение и проверьте атрибут "Удалить во время сборки".

In a constraint's size or attribute inspector, check the "Remove at build time" box.

Что это достигается:

  • Вы должны использовать Interface Builder для большей части вашего макета.
  • У вас не будет никаких предупреждений IB
  • Оно работает.

Единственным недостатком является то, что построитель интерфейса не сможет полностью представить ваш макет.