2011-06-14 14 views
6

Sto tentando di animare un UIlabel per ingrandirlo prima, quindi tornare alla sua cornice originale. Allargare il lavoro come previsto, ma non restringersi. Quando rimpicciolisco l'etichetta con il codice sottostante, la dimensione si regola prima che l'origine venga spostata. Ciò causa un'animazione in due passaggi che non è liscia.Animate UILabel non liscio

Ecco il mio codice:

CGRect rect = label.frame; 
[UIView animateWithDuration:.2 
         delay: 0.1 
        options: UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        label.frame = CGRectMake(rect.origin.x + 4, 
                     rect.origin.y + 4, 
                     rect.size.width-8, 
                     rect.size.height-8); 
       } 
       completion:^(BOOL finished){ 
       }]; 
+0

Non stai facendo una transizione. Perché stai usando 'UIViewAnimationOptionTransitionNone'? –

+0

Non dimenticare di distribuire la taglia :) – jmosesman

risposta

2

Si potrebbe provare ad applicare una trasformazione per l'etichetta all'interno del vostro blocco di animazione anziché regolare il rettangolo. Qualcosa come le seguenti linee per l'Ingrandimento/Riduzione animazioni:

label.transform = CGAffineTransformMakeScale(1.5, 1.5); //grow 
label.transform = CGAffineTransformMakeScale(1, 1);  //shrink 
2

Si prega di tryout questa soluzione, credo che è quello che stai cercando. L'ho provato per funzionare, ma per favore provalo e fammi sapere se lo stai cercando o no.

-(IBAction)growanimate:(id)sender 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkanimate)]; 
    label.transform = CGAffineTransformMakeScale(2.0f, 2.0f); //This will double label from current size. 
    [UIView commitAnimations]; 
} 

-(void)shrinkanimate 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    label.transform = CGAffineTransformMakeScale(1.0f, 1.0f); //This will get it back to original size. 
    [UIView commitAnimations]; 
} 
+0

thx..per la versione più dettagliata ma ho ottenuto la risposta in precedenza – prostock

1

Suppongo che il problema sia causato dal fatto che il ridimensionamento del frame attiva le notifiche di ridimensionamento. Ci possono essere più interruzioni quando si restringono perché vengono rivelate nuove aree del superview.

Il metodo di trasformazione è molto meglio, in questo caso.

Immagino anche che con il metodo di trasformazione, i percorsi e il layout dei glifi (interruzioni di riga e così ...) non vengano ricalcolati e CGPath sia semplicemente trasformato in tempo di rendering.


Riguardo al problema di centraggio, non vedo alcun problema.

Mi piacerebbe aggiungere che se si prevede di fare un uso estensivo di questo effetto, è possibile creare una classe statica per questo effetto, o contenente diverse animazioni preimpostate, con trasformazioni memorizzate staticamente all'interno.

Quindi si effettuano chiamate come [MyPopEffect popView: mylabel];

Evita la creazione e il rilascio di trasformazioni e consente l'utilizzo immediato per qualsiasi vista o in altri progetti.

Ad ogni modo, ecco il codice di animazione ... Cin cin

[

UIView animateWithDuration:0.5f delay: 0.0f 
    options:UIViewAnimationOptionCurveEaseOut+UIViewAnimationOptionBeginFromCurrentState 
     animations:^{ 
      label.transform=CGAffineTransformMakeScale(2.0f,2.0f); 
     } 
    completion:^(BOOL finished){ 
      [UIView animateWithDuration:0.5f delay: 0.0f 
      options:UIViewAnimationOptionCurveEaseIn+UIViewAnimationOptionBeginFromCurrentState 
      animations:^{ 
       label.transform=CGAffineTransformMakeScale(1.0f,1.0f); 
      } 
      completion:^(BOOL finished){}]; 
    }]; 

]