it-swarm.com.ru

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

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

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

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

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

94
Sulthan

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

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

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

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

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

37
Evan K. Stone

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

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

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

3
Martin Redington

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

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

2
Mike Pollard

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

1
Andrea

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

0
William Hu