2009-11-13 5 views
8

Ho cercato di capire un modo decente per animare senza problemi una modifica della dimensione del fotogramma su un UILabel, senza un ridisegno di salto iniziale. Quello che succede di default è che quando faccio qualcosa di simile:Animare il frame di UILabel senza problemi

// Assume myLabel frame starts as (0, 0, 100, 200) 
[UIView beginAnimations:@"myAnim" context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
[UIView setAnimationDuration:1.0]; 
myLabel.frame = CGRectMake(0.0, 0.0, 50, 100); 
[UIView commitAnimations]; 

ricevo un'animazione fluida con l'etichetta, tuttavia il modo in cui lo fa è che ci vuole il livello dell'immagine ridisegnato per il formato di destinazione dell'etichetta e allunga il contenuto per adattarlo alla corrente, quindi si anima nel rettangolo di destinazione. Questo finisce con un salto molto bizzarro nella visualizzazione del testo. Qui ci sono due immagini che mostrano l'aspetto pre-animazione e poi subito dopo l'animazione inizia:

pre-animazione

Post-Animazione

ho cercato di usare solo la strato per animare questo, ma ho ancora gli stessi problemi.

Quindi la domanda è: come posso evitare questo?

Grazie per qualsiasi aiuto,
Scott

+0

E 'una vecchia questione, ma io sono lotta con esattamente lo stesso problema. In qualche modo è illogico. Come ho capito i metodi di animazione dovresti essere in grado di animare la maggior parte delle proprietà su una classe UIView. Ma perché la proprietà frame di un UILabel si comporta in modo diverso durante l'animazione rispetto a una sottoclasse UIView normale. Sembra che la classe UILabel stia ignorando l'animazione per la dimensione e animi solo la modifica della posizione. Che crea un'animazione dall'aspetto piuttosto strano. Gradirei se qualcuno potesse aiutarmi con questo. – Chris

risposta

0

Animare il telaio non animare la modifica della dimensione dei caratteri. Se capisco quale comportamento stai vedendo, penso che l'etichetta adjustsFontSizeToFitWidth sia impostata su "Vero", quindi stai vedendo il fotogramma animato come dimensioni, seguito dalla regolazione istantanea della dimensione del carattere.

Si potrebbe provare a ridimensionare la trasformazione dell'etichetta in modo che la cornice e la scala dei caratteri siano simultaneamente.

+0

In realtà non è così. RegolaFontSizeToFitWidth non è impostato qui e in realtà sto * non * cercando di cambiare la dimensione del carattere, solo il frame, che è in giallo. Tuttavia, ciò che accade è che il frame di destinazione (in questo caso) "adatta" il testo, quindi prima ridisegna quel livello lo allunga per adattarlo alla cornice originale, quindi lo riduce. Ecco perché sembra strano come questo. –

+0

non sicuro poi. È un problema interessante. Vedrò se non riesco a riprodurlo più tardi oggi. Sono curioso di me stesso. – TechZen

30

Urrà per rispondere a una domanda morta di due anni, ma ho trovato la risposta. In Interface Builder o nel codice, modificare la proprietà contentMode dell'etichetta. Il tuo sembra essere impostato su scaleToFill; prova left o right.

+1

Se potessi, risponderò a questa risposta con 100! (Salta ancora a volte, ma va bene) – Ariel

+0

Questo non funziona !!! –

+0

TopLeft/Right o BottomLeft/Right potrebbe essere il contentMode corretto che si desidera a seconda dell'animazione esatta di cui si ha bisogno. – CedricSoubrie

7

Per espandere sulla risposta di @ cliclcly: Dal Panoramica della documentazione di UILabel: modalità contenuto

Il valore di default della classe UILabel è UIViewContentModeRedraw. Questa modalità fa sì che la vista ridisegni il suo contenuto di ogni volta che cambia il suo rettangolo di delimitazione. È possibile modificare questa modalità modificando la proprietà contentMode ereditata della classe .

Dalla documentazione della proprietà contentMode di UIView:

Il valore predefinito di questa proprietà è UIViewContentModeScaleToFill.

UILabels si comporta in modo diverso rispetto ad altri UIViews per impostazione predefinita perché la proprietà contentMode è diversa per impostazione predefinita.

-3

Basta disattivare il layout automatico per l'etichetta.

In Xcode, clicca sull'etichetta e quindi nel riquadro proprietà, deselezionare l'opzione auto-layout di

5

ho scoperto che UILabel animazioni di fotogrammi sono strani - la loro dimensione è impostata immediatamente alla dimensione finale e la il testo è reso per quella dimensione. Dopodiché viene animata solo la modifica della posizione, il che significa che se la dimensione della destinazione è (0,0), l'etichetta scompare immediatamente. Per ovviare a questa limitazione ho collocato l'etichetta all'interno di una vista della stessa dimensione che ritaglia le sottoview, autorizzo disabilitato per l'etichetta, e sto animando la superview dell'etichetta invece dell'etichetta stessa. Il risultato finale è che la cornice dell'etichetta è completamente animata, ma il testo contenuto non viene ricreato con, diciamo, una diversa dimensione del carattere, né il troncamento del testo cambia. Non è ancora perfetto, ma è adatto al mio scopo.

fotogramma iniziale:

initial frame

durante l'animazione:

During animation

Animazione concluso:

Animation ended

+0

Non posso credere di non averlo mai saputo di UILabels. Ma tu mi hai aiutato a risolvere un problema che mi aveva totalmente sconcertato - grazie! – Echelon