2010-07-21 18 views
9

Quando si aumenta l'altezza dell'etichetta, tutto è a posto e liscio. Quando si riduce, l'etichetta modifica istantaneamente le dimensioni, quindi il riposizionamento con l'animazione.Riduzione delle dimensioni delle etichette UIL

Ho provato a sostituire UILabel con UIView e, naturalmente, non c'è alcun problema con UIView.

C'è un modo speciale per animare la riduzione delle dimensioni di UILabel?

Ecco un progetto minimale che illustra il problema descritto. Download

+0

Da dove stai andando? – deanWombourne

+0

Dal frame dell'etichetta, progettato nel file pennino. Aggiornato. – Pablo

+0

http://stackoverflow.com/questions/17360402/why-are-animations-on-bounds-of-an-uilabel-only-working-when-increasing-the-size –

risposta

2

Penso che quello che vuoi cambiare sia i limiti, piuttosto che la cornice. From the docs:

"Il rettangolo dei limiti determina l'origine e la scala nel sistema di coordinate della vista all'interno del relativo rettangolo di riquadro e viene misurato in punti. L'impostazione di questa proprietà modifica il valore della proprietà del frame di conseguenza." - Classe UIView; proprietà bounds

Prova qualcosa di simile:

- (void)animate:(id)sender 
{ 
    ... 
    CGRect newBounds = testLabel.bounds; 
    newBounds.size.height += 50; 
    testLabel.bounds = newBounds; 
    ... 
} 
+0

L'aumento dei limiti cambia cornice, ma la cornice rimane lo stesso sullo schermo. I limiti decrescenti funzionano. Ma questa non è una soluzione, dal momento che ho bisogno sia di aumentare che di diminuire. Sospetto che questo sia un bug nel framework. – Pablo

+1

È vero, probabilmente è un bug. Potresti cambiare la tua gerarchia di vista per avere un UIView con lo sfondo blu e quindi un UILabel a dimensione fissa che ha solo i suoi montanti e molle impostati per fluttuare nel mezzo di UIView. Dato che l'UIView si anima correttamente potrebbe essere una soluzione. –

14

Il problema è che l'UILabel si ridisegna più presto i suoi cambiamenti di dimensione. (Non è possibile ridisegnare tutti i fotogrammi dell'animazione perché il rendering del testo avviene sulla CPU, non sulla GPU in cui vengono eseguite le animazioni di UIView.) È possibile evitare di ridisegnare modificando la proprietà contentMode dell'etichetta su, ad esempio, UIViewContentModeCenter.

+0

Le cose sono cambiate? Dopo aver provato questo sembra non funzionare .. –

+0

Molte grazie, ha lavorato per me –

+0

sprecato 2 giorni per scoprire queste impostazioni, grazie! – dreampowder

2

Utilizzare un CGAffineTransform per eseguire questa operazione.

[UIView animateWithDuration:1.0 animations:^{ 
    // Scale down 50% 
    label.transform = CGAffineTransformScale(label.transform, 0.5, 0.5); 
} completion:^(BOOL finished) { 
    [UIView animateWithDuration:1.0 animations:^{ 
     // Scale up 50% 
     label.transform = CGAffineTransformScale(label.transform, 2, 2); 
    }]; 
}]; 
+0

Ha funzionato per me, ma ha influito su altre animazioni come la dissolvenza in entrata e l'uscita dall'IView. puoi per favore dirmi come risolvere questo problema e perché queste animazioni si scontrano. Ho votato la tua risposta. – Developer

+2

utilizzando affinetransformations su UILAbles ha alcuni effetti collaterali brutti, come la distorsione del testo sull'etichetta. non è una soluzione utile. – katzenhut

Problemi correlati