2012-04-05 12 views
13

All'interno di un blocco di animazione UIView, c'è un modo per ottenere la durata dell'animazione corrente?Trova la durata dell'animazione del blocco di animazione corrente

[UIView animateWithDuration:1.0 animations:^{ 
    // float duration = ? 
}]; 
+0

Non sono sicuro di capire cosa intendi, la durata dell'animazione non dovrebbe essere 1.0? –

+2

sì, ma sto usando un componente all'interno del blocco che ha bisogno di conoscere la durata, e non voglio passare la durata come variabile – adamsiton

+0

Buona domanda +1 scusa non ho potuto aiutare. –

risposta

0

Dato che usi i blocchi, perché non acquisire semplicemente una variabile?

CGFloat duration = 1.0; 
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}]; 
+0

Accetto. Stiamo già superando la durata, quindi perché dovremmo trovare un altro modo per farlo. – Mrug

2

[CATransaction animationDuration] è quello che stai cercando per

+0

Sfortunatamente non funziona, il blocco dell'animazione UIView apparentemente non funziona direttamente con CATransaction. –

2

È possibile ottenere l'animazione corrente abbastanza facilmente. Per esempio, la creazione di un CATransaction:

CAAnimation *animation = [self.layer animationForKey:self.layer.animationKeys.firstObject]; 
[CATransaction begin]; 
[CATransaction setAnimationDuration:animation.duration]; 
[CATransaction setAnimationTimingFunction:animation.timingFunction]; 

// CALayer animation here 

[CATransaction commit]; 
2

TL; DR: utilizzare CALayer -actionForKey :, non -animationForKey:

@Dimitri risposta Bouniol s' non ha funzionato per me quando viene chiamato da un un setter influenzato all'interno di un blocco di animazione. Il motivo, a mio avviso, è che il sistema di animazione di UIView imposta lo stato prima di avviare l'animazione effettiva (e chiama i setter prima di avviare l'animazione effettiva). Ciò che ha funzionato per me è stato chiamare il simile -actionForKey: metodo sul livello. L'azione restituita ha la durata corretta impostata e può essere utilizzata come nella sua risposta.

CAAnimation *animation = (CAAnimation*) 
[self.layer [email protected]"position"]; // or property of interest 

[CATransaction begin]; 
[CATransaction setAnimationDuration:animation.duration]; 
[CATransaction setAnimationTimingFunction:animation.timingFunction]; 

// CALayer animation here 

[CATransaction commit]; 
Problemi correlati