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


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

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

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

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

6 90

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 вы могли видеть, что два больше не вокруг.

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