Co się dzieje z ograniczeniami po usunięciu widoku

109

Pytanie, które mam, jest proste, ale nie udało mi się znaleźć żadnych informacji w dokumentacji.

Co dzieje się z ograniczeniami układu, gdy widok zostanie usunięty z hierarchii widoków (lub przeniesiony do innego widoku)?

Na przykład, miejmy kontener Cz podglądami podrzędnymi Ai B. Kontener Cma pewne ograniczenia. Wtedy dzwonimy [A removeFromSuperview]. Po co się dzieje z ograniczeniami A?

Co wtedy się stanie, jeśli dodamy Ado Cponownie?

Sulthan
źródło

Odpowiedzi:

118

Wiązania zostaną usunięte. Jeśli ponownie dodasz A, będziesz musiał utworzyć dla niego nowe ograniczenia, lub jeśli zapiszesz ograniczenia przed usunięciem A, możesz dodać je z powrotem. Kiedy robię coś takiego, zapisuję takie ograniczenia dla widoku o nazwie 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];
    }
}
rdelmar
źródło
7
Czy ten fakt można znaleźć gdzieś w dokumentacji? Wierzę ci, ale wydaje się dziwne, że nigdzie nie wspomniano.
Sulthan
2
To zdrowy rozsądek, że ograniczenia są usuwane razem z widokiem. Gdyby nie były, w jaki sposób system układu mógłby je ocenić w przyszłej przepustce?
Mike Pollard
6
Choć wydaje się, że ta odpowiedź jest oczywista, nadal była niezwykle pomocna!
race_carr
1
@pnollet, nie wiem, dlaczego plakat w tym pytaniu zrobił to, co zrobił. Zarejestrowałem to w celu zweryfikowania, a kiedy usuwam podwidok i sprawdzam ograniczenia w nadzorze, te ograniczenia, które dotyczyły usuniętego widoku podrzędnego, zniknęły.
rdelmar
4
@Firo, jestem pewien, że powinny zostać usunięte, więc jeśli nie ma ich w iOS 6, prawdopodobnie jest to błąd. BTW, dokument dotyczący metody removeFromSuperview mówi: „Wywołanie tej metody usuwa wszelkie ograniczenia, które odnoszą się do usuwanego widoku lub do dowolnego widoku w poddrzewie usuwanego widoku”.
rdelmar
41

Ponieważ też miałem to pytanie, sprawdziłem w Apple Docs tylko kopnięcia i okazuje się, że jest udokumentowane, że ograniczenia zostały usunięte.

Dokumentacja dla państw metoda UIView removeFromSuperview:

Wywołanie tej metody usuwa wszelkie ograniczenia odnoszące się do usuwanego widoku lub do dowolnego widoku w poddrzewie usuwanego widoku.

Nie jestem pewien, czy zostało to udokumentowane w zeszłym roku, kiedy opublikowano oryginalne pytanie, ale pomyślałem, że udostępnię te informacje na wypadek, gdyby ktoś ich potrzebował ...

Evan Stone
źródło
Niesamowite dzięki za dodanie tego prosto z dokumentu
Esko918,
3

Pamiętaj jednak, że jeśli masz dwa niezależne widoki nadrzędne A i B oraz podwidok C, gdzie C jest obecnie podziałem A, z odpowiednimi ograniczeniami, wywołanie [B addSubview: C] NIE usunie żadnych ograniczeń związanych z A i C, a układ automatyczny zacznie generować wyjątki, ponieważ te ograniczenia nie odnoszą się już do widoków w tej samej hierarchii.

Będziesz musiał jawnie wywołać [C removeFromSuperview], aby usunąć ograniczenia, przed dodaniem C do B.

To prawda na Mac OS X - nie sprawdzałem iOS

Martin Redington
źródło
Ciekawy! Skąd masz te informacje? Dokumentacja addSubview nie wspomina o tym zachowaniu. Pytam, ponieważ obecnie mam sporadyczny wyjątek podczas usuwania kontrolera widoku, który mówi „Nie można zainstalować ograniczenia widoku” - coś, czego nie robię.
JimmyB
2

Więzy są również usuwane, gdy ty [A removeFromSuperview]

Zostają zapomniane, a ponowne dodanie A do C nie dodaje żadnych ograniczeń.

Mike Pollard
źródło
0

Są również usuwane, możesz wykonać prosty test. Wybierz widok SUBVIEW i utwórz ograniczenia kosztowe, które ograniczają SUBVIEW do zmiany rozmiaru jego superwizji (jak dołączone do krawędzi superview). Aby to zrobić, dodajesz SUBVIEW jako podwidok do tego CONTAINERVIEW i dodajesz jako ograniczenia coś takiego:
V: | - [SUBVIEW] - |
H: | - [PODGLĄD] - |
Te ograniczenia należy dodać do nadzoru SUBVIEW, a tym samym CONTAINERVIEW.
Jeśli usuniesz SUBVIEW, po prostu sprawdzając wszystkie ograniczenia CONTAINERVIEW, zobaczysz, że dwóch już nie ma.

Andrea
źródło
0

To pytanie również może udowodnić kreator interfejsów. Po przeciągnięciu i upuszczeniu a UIViewna ViewControllerograniczeniach dodawania, a następnie usuwaniu UIView, możesz zobaczyć, że niebieskie ograniczenia znikają.

William Hu
źródło
4
Storyboard nie udowadnia niczego o tym, jak zachodzi zachowanie środowiska uruchomieniowego. Storyboard może zrobić, co tylko zechce!
mxcl