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];
}
kod na after-edit z timerem wygląda niestety również bardzo skocznie ..:/ –
pomysł snapshot jest bardzo hacky i nie należy się do niego zbliżać, nie uważasz? –
@ 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