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.
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
Przepraszam, tęskniłem za tym. Dobry punkt –
[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