Chciałbym dodać do odpowiedzi n8gray, że w niektórych przypadkach będziesz musiał zadzwonić, setNeedsLayout
a następnie layoutIfNeeded
.
Załóżmy na przykład, że napisałeś niestandardowy widok rozszerzający UIView, w którym pozycjonowanie podglądów podrzędnych jest złożone i nie można tego zrobić za pomocą funkcji autoresizeMask lub AutoLayout iOS6. Niestandardowe pozycjonowanie można wykonać przez nadpisanie layoutSubviews
.
Jako przykład załóżmy, że masz niestandardowy widok, który ma contentView
właściwość i edgeInsets
właściwość, która umożliwia ustawienie marginesów wokół contentView. layoutSubviews
wyglądałoby tak:
- (void) layoutSubviews {
self.contentView.frame = CGRectMake(
self.bounds.origin.x + self.edgeInsets.left,
self.bounds.origin.y + self.edgeInsets.top,
self.bounds.size.width - self.edgeInsets.left - self.edgeInsets.right,
self.bounds.size.height - self.edgeInsets.top - self.edgeInsets.bottom);
}
Jeśli chcesz mieć możliwość animowania zmiany klatki po każdej zmianie edgeInsets
właściwości, musisz nadpisać edgeInsets
metodę ustawiającą w następujący sposób i wywołać, setNeedsLayout
a następnie layoutIfNeeded
:
- (void) setEdgeInsets:(UIEdgeInsets)edgeInsets {
_edgeInsets = edgeInsets;
[self setNeedsLayout]; //Indicates that the view needs to be laid out
//at next update or at next call of layoutIfNeeded,
//whichever comes first
[self layoutIfNeeded]; //Calls layoutSubviews if flag is set
}
W ten sposób, jeśli wykonasz następujące czynności, jeśli zmienisz właściwość edgeInsets wewnątrz bloku animacji, animowana będzie zmiana klatki elementu contentView.
[UIView animateWithDuration:2 animations:^{
customView.edgeInsets = UIEdgeInsetsMake(45, 17, 18, 34);
}];
Jeśli nie dodasz wywołania do layoutIfNeeded w metodzie setEdgeInsets, animacja nie zadziała, ponieważ layoutSubviews zostanie wywołany w następnym cyklu aktualizacji, co jest równoznaczne z wywołaniem go poza blokiem animacji.
Jeśli wywołasz tylko layoutIfNeeded w metodzie setEdgeInsets, nic się nie stanie, ponieważ flaga setNeedsLayout nie jest ustawiona.