2013-11-20 6 views
5

Ich habe eine UIView, in der ein UILabel als Unteransicht enthalten ist.Automatisch animierte Einschränkung animiert keine Subviews

Jetzt wechsle ich die Breite des UIView mit einer Animation (konstante Eigenschaft des Zwangs zu ändern) und rufen layoutIfNeeded in UIView animieren ...)

Die Ansicht ist normal Ändern der Größe, aber die UILabel (subview) Ändert die Schriftgröße in die 'End'-Größe, animierte aber nicht korrekt wie die uiview.

Gemäß der WWDC 2012-Sitzung sollten die Untersichten animiert werden, wenn nur die Konstante der Superview geändert wird.

Das UILabel hat eine minimale Schriftgröße von 0,1, die kleiner ist als die Schriftgröße.

Antwort

4

ich kämpfen, wurde eine UILabel Resize Animieren von seiner width Ändern Zwang. Das Etikett hatte adjustsFontSizeToFitWidth und minimumScaleFactor festgelegt.

Ich habe es durch Setzen der Etiketten contentMode auf UIViewContentModeScaleAspectFit behoben. Standardmäßig ist es für Labels UIViewContentModeLeft.

2

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]; 
} 
+0

Der Code auf After-Edit mit dem Timer sieht leider auch sehr jumpy ..:/ –

+1

die Snapshot-Idee ist sehr hacky und sollte nicht so angegangen werden, denkst du nicht? –

+0

@ 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

Verwandte Themen