2014-01-06 15 views
7

ich eine UILabel haben, die mit drei Textzeilen ausgelöst hat:iOS Animieren UILabel erweitern

locationDescription = [[UILabel alloc]init]; 
locationDescription.numberOfLines = 3; 
[locationDescription setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self addSubview:locationDescription]; 

ich dann eine Taste, die das Label erweitert:

- (void)buttonPressed:(UIButton *)sender{ 
    NSLog(@"Pressed"); 
    [UIView animateWithDuration:1 
        animations:^{locationDescription.numberOfLines = 0;} 
    ]; 
} 

Das gewünschte Verhalten für das Label ist Jede einzelne Zeile zeigt sich einzeln. Das Label wird zwar erweitert, aber der Übergang wird nicht animiert und alle Zeilen werden gleichzeitig angezeigt.

Was fehlt mir?

+0

Sie legen die Anzahl der Zeilen außerhalb der Animation Körper, innen es dann. Ist das hier ein Tippfehler? – Putz1103

+0

Ja, tut mir leid. Code bearbeitet – sheepgobeep

+0

Wahrscheinlich nicht das Problem, aber trotzdem: '-init' ist nicht der designierte Initialisierer für UILabel - benutze' -initWithFrame: 'stattdessen. – Caleb

Antwort

12

Sie Anzahl der Linien animieren. Es ändert die intrinsicSize des UILabel. Sie müssen layoutIfNeeded innerhalb Ihres Animationsblocks in der Ansicht aufrufen, die das UILabel enthält. Hier befestige ich eine Tippgeste an den Tisch, um zwischen 0 (beliebig vielen) Zeilen und 1 Zeile umzuschalten.

func tapLabel(tapGesture: UITapGestureRecognizer) 
{ 
    if let label = tapGesture.view as? UILabel { 
     label.numberOfLines = label.numberOfLines == 0 ? 1 : 0 
     UIView.animateWithDuration(0.5) { 
     label.superview?.layoutIfNeeded() 
     } 
    } 
} 

enter image description here

+0

Das funktioniert. One Gotcha: nach meiner Erfahrung, label.numberOfLines muss bei 0 beginnen. – MattyG

+10

mit "Content Mode" unter "Ansicht" bis "oben" es wird glatt die versteckten Linien enthüllen ... –

+0

@AxelZehden es ist die Antwort, die ich gesucht habe ! –

2

Sie können die Anzahl der Zeilen nicht animieren, Sie sollten die Größe animieren und die Anzahl der Zeilen von Anfang an auf 0 setzen.

Ich füge keinen Höhenberechnungscode hinzu, da dies die echte Animation hier verbergen würde.

self.locationDescription = [[UILabel alloc] init]; 
self.locationDescription.numberOfLines = 0; 
[locationDescription setTranslatesAutoresizingMaskIntoConstraints:NO]; 

// Say, it starts with 50. In your real code, height should be calculated 
// to fit the size you want, rounded to lines 
NSDictionary *viewsDict = @{@"locationDescription": self.locationDescription}; 
[self.locationDescription addConstraints: 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:[locationDescription(50)]" 
             options:0 metrics:nil 
              views:viewsDict]; 

Dann in der Aktion, tun

- (void)buttonPressed:(UIButton *)sender 
{ 
    NSLog(@"Pressed"); 
    // Assuming there is only one constraint. If not, assign it to another property 
    // I put 500, but, again, real size rounded to line height should be here 
    self.locationDescription.constraints[0].constant = 500; 
    [UIView animateWithDuration:1 animations:^{ 
     // Layouting superview, as its frame can be updated because of a new size 
     [self.locationDescription.superview layoutIfNeeded]; 
    }]; 
} 

Außerdem sollten Sie locationDescription auf eine Eigenschaft und den Zugang mit self. vor zuweisen.

+0

Ich fing tatsächlich damit an, aber das layoutIfNeeded schien den Text ebenfalls neu zu zeichnen, also wenn das Objekt animiert wurde, bewegten sich sowohl der Text als auch die Bounding Box herum. – sheepgobeep

+0

@sheepgobeep Eine Option ist die Verwendung von 'TTTAttributedLabel', das eine vertikale Ausrichtung unterstützt. In diesem Fall bleibt der Text an der gleichen Stelle und zeigt neue Zeilen an. – coverback

2

Das Blockobjekt von UIView animateWithDuration enthält die Änderungen, die an die Ansichten übergeben werden müssen. Hier ändern Sie programmgesteuert alle animierbaren Eigenschaften der Ansichten in Ihrer Ansichtshierarchie. Die von Ihnen angegebene Eigenschaft numberOfLines ist jedoch keine animierbare Eigenschaft.

Die folgenden Eigenschaften der UIView Klasse, die Elternklasse von UILabel ist sind animierbaren:

@property frame 
@property bounds 
@property center 
@property transform 
@property alpha 
@property backgroundColor 
@property contentStretch 
Verwandte Themen