Что происходит с ограничениями при удалении представления
Вопрос у меня простой, но я не мог найти никакой информации в документации.
Что происходит с ограничениями макета, когда представление удаляется из иерархии представления (или перемещено в другое представление)?
Например, пусть контейнер 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
, вы увидите, что синие ограничения исчезают.