Що відбувається з обмеженнями, коли видалення видалено


109

Питання у мене просте, але я не зміг знайти жодної інформації в документації.

Що відбувається з обмеженнями макета, коли вигляд видаляється з ієрархії подання (або переміщується до іншого перегляду)?

Наприклад, давайте контейнер Cз підпреглядами Aта B. У контейнері Cє деякі обмеження. Тоді ми дзвонимо [A removeFromSuperview]. Що відбувається з обмеженнями A?

Що ж станеться , якщо ми додамо Aдо Cзнову?

Відповіді:


118

Обмеження усуваються. Якщо ви знову додасте 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];
    }
}

7
Чи можна цей факт знайти десь у документації? Я вірю вам, але здається дивним, що факт ніде не згадується.
Султан

2
Це здоровий глузд, що обмеження видаляються разом із поглядом. Якби вони не були, як система компонування змогла б оцінити їх у майбутньому пропуску?
Майк Поллард

6
Настільки очевидно, як ця відповідь здається, що це було б, вона все ще надзвичайно корисна!
race_carr

1
@pnollet, я не знаю, чому плакат у цьому питанні робив те, що робив. Я зареєстрував це, щоб перевірити, і коли я видаляю підпрез і перевіряю обмеження на перегляді, ті обмеження, які стосуються видаленого підперегляду, вже відсутні.
rdelmar

4
@Firo, я впевнений, що їх слід видалити, тому якщо вони не в iOS 6, це, ймовірно, помилка. BTW, документ про метод removeFromSuperview говорить: "Виклик цього методу видаляє будь-які обмеження, що стосуються виду, який ви видаляєте, або які стосуються будь-якого виду в піддереві подання, яке ви видаляєте".
rdelmar

41

Оскільки у мене виникло і це питання, я перевірив Apple Docs лише на ноги, і виявляється, що документально підтверджено, що обмеження усунені.

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

Виклик цього методу видаляє будь-які обмеження, що стосуються вида, який ви видаляєте, або які стосуються будь-якого виду в піддереві подання, яке ви видаляєте.

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


Дякую за те, що додали це прямо з документа
Esko918

3

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

Для видалення обмежень вам потрібно буде чітко зателефонувати [C removeFromSuperview], перш ніж додавати C до B.

Це вірно в Mac OS X - я не перевіряв iOS


Цікаво! Звідки ви взяли цю інформацію? Документи для addSubview не згадують про цю поведінку. Я запитую, тому що в даний час я маю спорадичне виняток, коли видаляючи контролер перегляду, йдеться про "Неможливо встановити обмеження для перегляду" - те, чого я не роблю.
JimmyB

2

Обмеження також знімаються, коли ви [A removeFromSuperview]

Вони забуті, і додавання A до C знову не додає обмежень.


0

Їх теж видаляють, можна зробити простий тест. Виберіть перегляд SUBVIEW і створіть обмеження, які обмежують SUBVIEW, щоб дотримуватися його зміни розміру нагляду (як, наприклад, прикріплене до ребер огляду). Для цього ви додаєте SUBVIEW як підвид до цього CONTAINERVIEW і додаєте як обмеження щось подібне:
V: | - [SUBVIEW] - |
Н: | - [ПІДПРИЄМСТВО] - |
Ці обмеження слід додати до нагляду SUBVIEW, таким чином ВІДМОВИТИ.
Якщо ви видалите SUBVIEW, просто перевіривши всі обмеження CONTAINERVIEW, ви побачите, що двох вже немає.


0

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


4
Розкадровка нічого не підтверджує, як відбуватиметься поведінка під час виконання. Розкладка може робити все, що завгодно!
mxcl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.