2013-11-20 17 views
5

Mam UIView, który ma UILabel jako subview w nim.Ograniczenie animacji autolayout nie powoduje animate subviews.

Teraz mogę zmienić szerokość UIView z animacją (zmiana stałej właściwości przymusu) i zadzwoń layoutIfNeeded w UIView animacji ...)

Widok jest zmiana rozmiaru normalnego, ale UILabel (podrzędny) zmienia rozmiar czcionki na "końcowy", ale nie animuje się prawidłowo, podobnie jak uiview.

Zgodnie z sesją WWDC 2012 subviews powinien animować, jeśli zmieni się tylko stała superwizji.

UILabel ma minimalną skalę czcionek równą 0,1, która jest mniejsza niż rozmiar czcionki, którą należy zmienić.

Odpowiedz

4

Miałem problemy ożywiania UILabel Resize zmieniając width przymus. Etykieta miała zestaw adjustsFontSizeToFitWidth i minimumScaleFactor.

Naprawiłem to ustawiając etykiety "contentMode na UIViewContentModeScaleAspectFit. Domyślnie dla etykiet jest to UIViewContentModeLeft.

2

Nie sądzę, że można animować rozmiar tekstu w ten sposób. Jedyny sposób, w jaki mogę to zrobić, polega na utworzeniu widoku migawki etykiety, dodaniu tego widoku do etykiety, wykonaniu animacji, a następnie usunięciu widoku migawki. Ten kod nieznacznie przesuwa mniejszy tekst, ale wygląda całkiem nieźle, z niewielkim ruchem po odkryciu etykiety i usunięciu widoku obrazu. Mały widok zawierający etykietę miał rozmiar 185 x 36, a etykieta miała ograniczenia po 20 na każdą stronę smallView i 8 na górę i 7 na dół. Dodaję te same ograniczenia w kodzie do widoku obrazu.

@interface ViewController() 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *widthCon; // width constraint on smallView 
@property (weak,nonatomic) IBOutlet UIView *smallView; // view that the label is embedded in 
@property (weak,nonatomic) IBOutlet UILabel *label; 
@end 

@implementation ViewController 

- (IBAction)shrinkView:(id)sender { 

    UIView *snapshot = [self.label snapshotViewAfterScreenUpdates:YES]; 
    [snapshot setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.smallView addSubview:snapshot]; 
    [self.smallView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[snapshot]-20-|" options:0 metrics:nil views:@{@"snapshot":snapshot}]]; 
    NSLayoutConstraint *topCon = [NSLayoutConstraint constraintWithItem:snapshot attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.smallView attribute:NSLayoutAttributeTop multiplier:1 constant:8]; 
    NSLayoutConstraint *bottomCon = [NSLayoutConstraint constraintWithItem:self.smallView attribute:NSLayoutAttributeBottom relatedBy:0 toItem:snapshot attribute:NSLayoutAttributeBottom multiplier:1 constant:7]; 
    [self.smallView addConstraints:@[topCon,bottomCon]]; 
    [self.smallView layoutSubviews]; 
    self.label.alpha = 0; 
    self.widthCon.constant = 100; 
    topCon.constant = 18; 
    bottomCon.constant = 10; 
    [UIView animateWithDuration:.5 animations:^{ 
      [self.view layoutIfNeeded]; 
     } completion:^(BOOL finished) { 
      self.label.alpha = 1; 
      [snapshot removeFromSuperview]; 
     }]; 
} 

Po EDIT:

Jest sposób animować widoku tak, że etykieta animuje także w dół, a nie będzie natychmiast do jego wielkości końcowej. Musisz animować ograniczenie bezpośrednio za pomocą licznika czasu (patrz wyjaśnienie na około 31 minut do wideo WWDC 2012, "Najlepsze praktyki w opanowaniu automatycznego układu"). Działa to w celu animacji rozmiaru etykiety, ale zmiana rozmiaru czcionki jest skoczna i nie wygląda tak dobrze. Jeśli mają szerokość ograniczenie do poglądu, że etykieta jest w (a etykieta ma ograniczenia do dwóch stron), to można to zrobić:

-(IBAction)animateSizeChange:(id)sender { 
    [NSTimer scheduledTimerWithTimeInterval:.001 target:self selector:@selector(doStuff:) userInfo:Nil repeats:YES]; 
} 

-(void)doStuff:(NSTimer *) aTimer { 
    self.widthCon.constant -= .2; 
    if (self.widthCon.constant <90) [aTimer invalidate]; 
} 
+0

kod na after-edit z timerem wygląda niestety również bardzo skocznie ..:/ –

+1

pomysł snapshot jest bardzo hacky i nie należy się do niego zbliżać, nie uważasz? –

+0

@ Christian'fuzi'Orgler, nie, nie sądzę, że jest w ogóle hacky. Apple wykorzystuje tę "sztuczkę" w swoich własnych animacjach. Poza tym, jaka jest alternatywa? Co do twojego pierwszego komentarza, tak, to jest podchwytliwe, to jest to, co powiedziałem - włączyłem to tylko po to, aby pokazać sposób, w jaki można animować widok podrzędny widoku, który czasami działa dobrze, jeśli nie próbujesz zmniejszyć rozmiaru tekstu. – rdelmar

Powiązane problemy