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

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

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

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

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

Ответ 1

Ограничения удаляются. Если вы снова добавите 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];
    }
}

Ответ 2

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

documentation для метода удаления UIView removeFromSuperview:

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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