2013-06-10 7 views
10

Mam dziwny problem z bardzo prostym zadaniem.AutoLayout i UILabel zmiana rozmiaru animacji nie działa poprawnie na obrót urządzenia

ja potrzebuje bardzo małych instalacji do odtworzenia problemu:

|--------------------------------------| 
|    Parent View    | 
|          | 
||------------------------------------|| 
||    UILabel    || 
||------------------------------------|| 
|          | 
|          | 
||------------------------------------|| 
||    UIView    || 
||------------------------------------|| 
|          | 
|          | 
|--------------------------------------| 

W powyższym przykładzie mamy widok rodzica z 2 subviews -> A UILabel i prosty UIView. Im przy autoLayout zastosować układ pokazany powyżej:

Constraints for UILabel: 
Leading Space to superview = 0 
Trailing Space to superview = 0 
Fixed Height constraint (e.g. 80pt) 
Top Space constraint (e.g. 50pt) 

The UIView subview has the same constraint types (the values for height and top space differs). 

Więc co się spodziewać z tej konfiguracji jest to, że oba subviews przyjmie pełną szerokość jego rodzica jak określiliśmy, że początkowe i końcowe przestrzeń powinna wynosić zero. więc jeśli zmienisz szerokość widoku nadrzędnego, szerokość subviews również powinna się zmienić, aby pozostać wyrównanym.

pozwala powiedzieć, że widok nadrzędny ma wymiar 200x400 pt. kiedy buduję i uruchamiam mój portret w ujęciu portretowym, wszystko wygląda dobrze. kiedy obracam się do krajobrazu, wszystko nadal wygląda dobrze. Widoki rodzica szerokości, a nawet szerokość subviews wzrosła. ale teraz, kiedy obraca się z powrotem do portretu uilabels szerokość natychmiast dostaje swoją docelową szerokość bez animacji:

|--------------------------------------| 
|    Parent View    | 
|          | 
| (immediately has target size)  | 
|   |--------------|   | 
|   | UILabel |   | 
|   |--------------|   | 
|          | 
| (this subview is still    | 
|    animating its width)  | 
| |------------------------------| | 
|-->|   UIView    |<--| 
| |------------------------------| | 
|          | 
|          | 
|--------------------------------------| 

rodzic widoki szerokość i UIView subviews szerokość są prawidłowo animowane. to tylko uilabel, który ma dziwne zachowanie tutaj i nie mogę się dowiedzieć, co powoduje ten problem.

+0

Programowo tworzysz hierarchię i ograniczenia? W takim przypadku, czy ustawiłeś translatesAutoresizingMaskIntoConstraints na NO? –

+0

wymyśliłeś to? Mam ten sam problem – user18853

Odpowiedz

0

Problem nie polega na tym, że UILabel nie animuje zmiany rozmiaru, ale tekst nie jest animowany. Jeśli chcesz nadać etykiecie inny kolor tła, okaże się, że rzeczywiście jest animowany, a jest to tylko tekst, który przeskakuje na pozycję.

Jednym ze sposobów naprawy jest zmiana szerokości etykiety bez animacji i przesuwanie jej o X punktów, gdzie X jest o połowę różnicy między początkową a końcową szerokością, a następnie ożywiają swoją pozycję.

Jedynym problemem związanym z tą metodą dla twojego kodu jest to, że nie wierzę, że będziesz w stanie to zrobić z automatycznym układem.

0

Jak pamiętam, dla ograniczeń należy podać trochę więcej specyfikacji, ale dla tak łatwych elementów interfejsu sugerowałbym używanie masek UIViewAutoresizing. Są znacznie prostsze i mają krótsze definicje. W twoim przypadku wystarczy użyć UIViewAutoresizingFlexibleWidth.

0

Lepiej ustawić autolayout w story board. Upewnij się, że wszystkie widoki podrzędne są wybrane w kontrolerze widoku podczas ustawiania wiązań. W tym celu należy wykonać następujące czynności:

  1. Kliknij na widoku głównego kontrolera widoku
  2. Prasa Ctrl+A
  3. Kliknij Resolve Auto-układ Problemy
  4. wybierz Dodaj brak ograniczeń w widoku kontrolera

Następnie więzy zostaną ustawione na wszystkie subviews i będą działać idealnie podczas rotacji.

1

Moje propozycje to:

Jeśli podklasy widok rodzic używać - (void)layoutSubviews:

- (void)layoutSubviews { 
    label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); 
    childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); 
} 

jeśli nie podklasy widoku nadrzędnego można użyć autoresizingMask:

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
Powiązane problemy