La mia app utilizza CALayer
per disegnare viste. Più precisamente, utilizza il metodo drawLayer:inContext:
su un sottolivello del livello superiore di UIView
. Questo è un buon modo per ottenere l'animazione "implicita" dei disegni consecutivi di drawLayer:inContext:
che si dissolvono a vicenda nel tempo. Le animazioni in dissolvenza avvengono abbastanza velocemente, forse in 0,25 secondi, ma per modificarne la durata, è sufficiente implementare un altro metodo delegato chiamato actionForLayer:forKey:
. In questo esempio di implementazione perfettamente funzionante qui la durata predefinita è allungato a 2,0 secondi:CALayer dissolvenza dal valore corrente
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.duration = 2.0;
return animation;
// or return nil for the default duration.
}
On per la questione a portata di mano.
Se chiami [sublayer setNeedsDisplay]
più velocemente di quanto le dissolvenze abbiano il tempo di completare, con ogni nuova dissolvenza vedrai un salto improvviso. A giudicare dall'aspetto, la dissolvenza in corso viene annullata e lo stato finale viene utilizzato come punto di partenza della nuova dissolvenza. Questo potrebbe non essere molto sorprendente, ma il risultato visivo è piuttosto indesiderato.
Considerare lo scenario di una dissolvenza di dieci secondi da nero a bianco, con un'altra dissolvenza, a nero, attivata cinque secondi dopo l'inizio. L'animazione inizierà a sbiadire dal nero al bianco, ma quando è a un "mezzo grigio" salta al bianco completo prima di sbiadire di nuovo in nero.
C'è un modo per evitare che ciò accada? Posso far sbiadire il livello dal grigio al nero? Esiste un equivalente di disegno CALayer del UIViewAnimationOptionBeginFromCurrentState
(utilizzato nelle animazioni di UIView)?
Cheers.
P.S. Questo post mi ha aiutato a trovare un bug nella mia API che sto sviluppando ... Grazie. –
E il tuo post mi ha aiutato a sistemare l'animazione, grazie! – epologee