Ich glaube nicht, dass Sie die Größe des Textes so animieren können. Die einzige Möglichkeit, dies zu tun, besteht darin, eine Schnappschussansicht des Etiketts zu erstellen, diese Ansicht über das Etikett hinzuzufügen, die Animation auszuführen und dann die Schnappschussansicht zu entfernen. Dieser Code verschiebt den kleineren Text etwas nach unten, aber es sieht ziemlich gut aus, mit nur einer sehr kleinen Bewegung, wenn Sie das Label einblenden und die Bildansicht entfernen. Die kleine Ansicht, die das Etikett enthält, hatte eine Größe von 185 x 36, und das Etikett hatte Beschränkungen von 20 auf jeder Seite von SmallView und 8 auf der Oberseite und 7 auf der Unterseite. Ich füge dieselben Einschränkungen in Code zur Bildansicht hinzu.
@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];
}];
}
Nach Edit:
Es gibt einen Weg, um die Ansicht zu animieren, so dass das Etikett beseelt auch eher nach unten, als ich sofort auf seine Endgröße. Sie müssen die Abhängigkeit direkt mit einem Zeitgeber animieren. (Sehen Sie sich die Erklärung nach ca. 31 Minuten im WWDC 2012-Video "Best Practices für das Mastering von Auto-Layouts" an). Dies funktioniert, um die Größe des Labels zu animieren, aber die Änderung der Schriftgröße ist nervös und sieht nicht gut aus. Wenn Sie eine Breite Einschränkung der Ansicht haben, dass das Etikett ist in (und das Etikett Zwänge zu den beiden Seiten), dann können Sie dies tun:
-(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];
}
Der Code auf After-Edit mit dem Timer sieht leider auch sehr jumpy ..:/ –
die Snapshot-Idee ist sehr hacky und sollte nicht so angegangen werden, denkst du nicht? –
@ Christian'fuzi'Orgler, nein, ich denke nicht, dass es hacky ist. Apple verwendet diesen "Trick" in einigen ihrer eigenen Animationen. Außerdem, was ist die Alternative? Was deinen ersten Kommentar betrifft, ja, es ist nervös, das habe ich gesagt - ich habe das nur hinzugefügt, um einen Weg zu zeigen, wie man eine Unteransicht einer Ansicht animieren kann, was manchmal gut funktioniert, wenn man nicht versucht, Text zu verkleinern. – rdelmar