Что происходит с ограничениями при удалении представления
вопрос у меня простой, но я не мог найти любую информацию в документации.
что происходит с ограничениями компоновки, когда представление удаляется из иерархии представлений (или перемещается в другое представление)?
например, давайте контейнер C
с subviews A
и B
. Контейнер C
имеет некоторые ограничения. Тогда мы зовем [A removeFromSuperview]
. Что происходит с ограничениями для A
?
что тогда произойдет, если мы добавим A
to C
снова?
6 ответов:
ограничения снимаются. Если вы добавите 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 просто для удовольствия, и оказалось, что документально подтверждено, что ограничения удалены.
The документация для метода UIView removeFromSuperview состояния:
вызов этого метода удаляет все ограничения, которые относятся к представлению вы удаляют или ссылаются на любое представление в поддереве представления, которое вы убираем.
Я не уверен, что это было задокументировано в прошлом году, когда был опубликован исходный вопрос, но я просто подумал, что поделюсь этой информацией, если кому-то это понадобится...
однако имейте в виду, что если у вас есть два независимых родительских представления A и B и подвида C, где C в настоящее время является подвидом A, с соответствующими ограничениями, то вызов [b addSubview:C] не очистит никаких ограничений, связанных с A и C, и auto layout начнет выбрасывать исключения, потому что эти ограничения больше не относятся к представлениям в той же иерархии.
вам нужно будет вызвать [c removeFromSuperview] явно, чтобы удалить ограничения, прежде чем добавлять C в Б.
Это правда на Mac OS X - я не проверял iOS
ограничения также удаляются, когда вы
[A removeFromSuperview]
они забываются и добавление A В C снова не добавляет никаких ограничений.
Они тоже удаляются, вы можете сделать простой тест. Подобрать вид панель и создать costraints, что ограничение ПОДПАНЕЛЬ следовать его суперпанель изменением размеров (как прикрепленное к суперпанель края). Для этого вы добавляете SUBVIEW как subview в этот CONTAINERVIEW и добавляете в качестве ограничений что-то вроде этого:
V: / - [SUBVIEW] -/
H:| - [SUBVIEW] -/
Эти ограничения должны быть добавлены в супервизор SUBVIEW, таким образом CONTAINERVIEW.
Если вы удалите SUBVIEW, просто проверив все Ограничения CONTAINERVIEW вы могли видеть, что два больше не вокруг.