2013-06-21 15 views
9

Podczas korzystania z autolayout, rozumiem, że usunięcie subview (przy jednoczesnym zachowaniu odniesienia do niego), usunięty wyskok wciąż zna jego ograniczenia autolayout.Usuwanie i ponowne dodawanie podglądu z autoukładem

Jednak po dodaniu go do widoku super później, widok nie będzie już znał rozmiaru klatki. Raczej wydaje się uzyskać zerową ramkę.

Założono, że autolayout automatycznie zmieściłoby to w celu spełnienia ograniczeń. Czy tak nie jest? Myślałem, że układ automatyczny oznaczał, że nie zadzieraj z klarownymi ramkami. Czy nadal muszę ustawić początkową klatkę prostą przy dodawaniu podglądu, nawet przy automatycznym układzie?

Odpowiedz

16

Podczas usuwania subview wszystkie więzy, które odnoszą się do tego przeglądu, zostaną utracone. Jeśli chcesz ponownie dodać podgląd podrzędny później, musisz ponownie dodać ograniczenia do tego podglądu.

Zazwyczaj utworzę wiązania w moim niestandardowym widoku podrzędnym. Na przykład:

-(void)updateConstraints 
{ 
    if (!_myLayoutConstraints) 
    { 
     NSMutableArray *constraints = [NSMutableArray array]; 

     // Create all your constraints here 
     [constraints addWhateverConstraints]; 

     // Save the constraints in an ivar. So that if updateConstraints is called again, 
     // we don't try to add them again. That would cause an exception. 
     _myLayoutConstraints = [NSArray arrayWithArray:constraints]; 

     // Add the constraints to myself, the custom subview 
     [self addConstraints:_myLayoutConstraints]; 
    } 

    [super updateConstraints]; 
} 

updateConstraints będzie wywoływana automatycznie przez program autoLayout. Powyższy kod znajduje się w Twojej niestandardowej podklasie: UIView.

Masz rację, że podczas pracy z programem Autolayout nie chcesz dotykać rozmiarów ramek. Zamiast tego po prostu zaktualizuj ograniczenia w updateConstraints. Lub, jeszcze lepiej, skonfiguruj ograniczenia, więc nie musisz.

Zobacz moją odpowiedź w tym temacie:

Autolayout UIImageView with programatic re-size not following constraints

Nie trzeba ustawić początkowy ramki. Jeśli używasz initWithFrame, po prostu ustaw na CGRectZero. Twoje ograniczenia będą - w rzeczywistości musi - szczegóły, jak duże coś powinno być, lub inne relacje, które oznaczają, że środowisko wykonawcze może wydedukować rozmiar.

Na przykład, jeśli Twój format wizualny to: @"|-[myView]-|", to wszystko, czego potrzebujesz do wymiaru poziomego. Autolayout będzie wiedział, rozmiar myView, aby być do granic rodzica superview oznaczone przez |. To całkiem fajne.

+1

Dzięki. To jest miłe i jasne. Jedna uwaga, którą zapytałem o Cocoa, a nie Cocoa-touch, ale dla innych zauważyć, API są (jak to opisał Peter Ammon ofApple) tak samo lub prawie tak samo. Podejścia w obu światach powinny być takie same. – uchuugaka

+1

Przepraszam, tęskniłem za tym. Dobry punkt –

+1

[Dokumentacja] (https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) mówi, że to ** ważne ** nazywanie "[super updateConstraints]" jako ostatnim krokiem w twojej implementacji. Powinien iść na końcu twojej metody, a nie na początku. – Eric

Powiązane problemy