Что происходит с ограничениями при удалении представления

Вопрос у меня простой, но я не мог найти никакой информации в документации.

Что происходит с ограничениями макета, когда представление удаляется из иерархии представлений (или перемещено в другое представление)?

Например, давайте возьмем контейнер C с подпунктами A и B Контейнер C содержит некоторые ограничения. Затем мы вызываем [A removeFromSuperview] . Что происходит с ограничениями для A ?

Что произойдет, если мы снова добавим A в C ?

Ограничения удаляются. Если вы снова добавите A, вам придется создавать новые ограничения для него или если вы сохраните ограничения перед удалением A, вы можете добавить их обратно. Когда я делаю что-то подобное, я сохраняю ограничения, подобные этому, для вида с именем view1:

 self.portraitConstraints = [NSMutableArray new]; for (NSLayoutConstraint *con in self.view.constraints) { if (con.firstItem == self.view1 || con.secondItem == self.view1) { [self.portraitConstraints addObject:con]; } } 

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

Документация для метода UIView removeFromSuperview гласит:

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

Я не уверен, что это было зарегистрировано в прошлом году, когда был отправлен исходный вопрос, но я просто подумал, что буду делиться этой информацией, если кому-то это понадобится …

Имейте в виду, что если у вас есть два независимых родительских представления A и B и subview C, где C в настоящее время является подчиненным A, с соответствующими ограничениями, то вызов [B addSubview: C] НЕ будет устранять любые ограничения, связанные с A и C, а автоматический макет начнет бросать исключения, потому что эти ограничения больше не относятся к представлениям в одной иерархии.

Вам нужно будет явно вызвать [C removeFromSuperview], чтобы удалить ограничения, прежде чем добавлять C в B.

Это верно для Mac OS X – я не проверял iOS

Ограничения также удаляются, когда вы [A removeFromSuperview]

Они забыты и добавление A в C снова не добавляет ограничений.

Они также удалены, вы можете сделать простой тест. Возьмите представление SUBVIEW и создайте ценовые ограничения, которые ограничивают SUBVIEW, чтобы следить за его изменением размера супервизора (например, с учетом границ супервизора). Для этого вы добавляете SUBVIEW в качестве подпрограммы к этому КОНТЕЙНЕРУ и добавляете в качестве ограничений что-то вроде этого:
V: | – [подвид] – |
H: | – [подвид] – |
Эти ограничения должны быть добавлены в SUBVIEW superview, таким образом CONTAINERVIEW.
Если вы удалите SUBVIEW, просто проверив все ограничения CONTAINERVIEW, вы увидите, что их уже нет.

Этот вопрос также может быть доказан конструктором интерфейса. При перетаскивании UIView на ViewController добавьте ограничения, затем удалите UIView , вы увидите, что синие ограничения исчезают.

  • Обновление NSLayoutConstraints после первого представления таблицы
  • С ограничениями макета iOS можно сбрасывать отступы между ярлыками, когда высота равна 0?
  • Почему я получаю «Автоматический макет, который все еще требуется после выполнения -layoutSubviews» при каждом запуске приложения?
  • Как исправить странные ошибки NSLayoutConstraint, которые, похоже, не влияют на макет в пользовательском UITableViewCell
  • Стиль ограничения iOS: addConstraints vs .isActive = true
  • Программное создание ограничения «расстояние до ближайшего соседа»
  • Регулярное расстояние с помощью AutoLayout
  • ios изменяет ограничение программно
  • Autolayout: Добавить ограничение для просмотра, а не руководство Top Layout?
  • Текст UILabel не изменяется автоматически с помощью автоматической компоновки
  • Почему, когда я перемещаю свой UILabel до определенного момента, он перемещается, когда я вхожу в полноэкранный режим?
  • Interesting Posts
    Давайте будем гением компьютера.