2011-11-07 13 views
13

Mi sembra che la prima volta che eseguo un'animazione (animando il fotogramma di un UIView, o la posizione di un CALayer, ecc.) Sia piuttosto mosso, e le successive animazioni siano fluide.Perché le animazioni iOS rallentano la prima volta che vengono eseguite?

Che cosa causerebbe questo, e c'è un modo per pre-memorizzare l'animazione?

Nota: questa domanda è molto simile a questa: UIImageView animations lag at first run, ma UIImages non viene utilizzato nelle mie animazioni.

+0

Hai detto che questo è un duplicato di [animazioni UIImageView ritardo in un primo run] (http://stackoverflow.com/questions/ 3382478/UIImageView-animazioni-lag-in-first-run). – Moshe

+0

È vero, l'ho fatto. Immagino non sia tanto un duplicato come pensavo, perché non ho a che fare con UIImages nelle mie animazioni. Modificato quella parte della domanda. – ryleigh

+0

@ryleigh - Abbastanza giusto. È una buona domanda, quindi, avere un upvote. – Moshe

risposta

0

Supponendo che si stia utilizzando [UIImage imageNamed: @"herp.png"], l'immagine verrà memorizzata nella cache. Se l'immagine viene disegnata molto, verrà decompressa in memoria, altrimenti eseguirà un carico pigro dell'immagine e causerà una balbuzie.

+0

Le animazioni di cui mi occupo non stanno utilizzando UIImages, anche se questo è bello sapere. Per essere precisi, in un caso sto rimuovendo un UITextView dal suo genitore, aggiungendolo ad un'altra vista e usando '[UIView animate ...]' per animare il suo frame. La prima volta che viene eseguito, la balbuzie, e dopo che è tornata alla sua vista originale e l'animazione viene nuovamente attivata, è liscia. – ryleigh

+0

Ciò include il rendering di qualsiasi elemento. Se il testo non viene mai modificato, sarà necessario renderlo solo una volta. Ciò potrebbe ancora causare il tuo problema. Tuttavia, dopo aver letto i tuoi altri post, molto probabilmente avrà qualcosa a che fare con la tua tastiera. – Nico

0

Eseguirlo in viewDidAppear, anziché viewWillAppear. La memorizzazione nella cache dovrebbe verificarsi dopo che l'immagine ha visualizzato e dovrebbe essere la stessa per l'utente.

+0

Bene, le animazioni di cui mi occupo sono in risposta all'input dell'utente, quindi non posso riprodurle correttamente quando appare la vista. Ho usato 'viewWillAppear' perché speravo che ci fosse un modo per riprodurli prima che l'utente potesse vederli (il che sembra sciocco). – ryleigh

+0

Dispari. Stai utilizzando i metodi [UIView beginAnimations] o i metodi basati su blocchi [UIView animateWithDuration: animations: ...]? Quali proprietà stai animando? Qualcosa oltre al telaio? Quanti di quale tipo di oggetto? – Tim

+0

Bene in un caso sto rimuovendo un UITextView dal suo genitore, aggiungendolo ad un'altra vista, e usando [UIView animateWithDurationsEtc ...] per animare il suo frame. Anche se allo stesso tempo l'animazione suona, la tastiera viene richiamata, quindi sto iniziando a sospettare che la creazione della tastiera sia ciò che fa balbettare l'animazione in quel caso. Ha senso che la tastiera sia ora memorizzata nella cache da qualche parte, in modo che non debba essere ricreata la prossima volta che è necessaria? In tal caso, c'è un modo per inizializzarlo? – ryleigh

2

Se si dispone di un TextField, che presumo è ciò che riceve l'input dell'utente. Utilizzare i metodi UITextFieldDelegateDid e non Should

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//Do textfield animations and other view animations here

}

Non fare le animazioni in;

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
//Don't do textfield animations and other view animations here
//This is where the system does its own animations; raising the keyboard, etc
}

+0

Qual è il motivo tecnico del tuo suggerimento? Perché le animazioni non funzionano senza problemi in "dovrebbe"? –

Problemi correlati