2015-01-22 9 views
6

Attualmente sto leggendo Core Animation Guide di Apple, dove ho trovato il seguente passo per quanto riguarda viste strato-backed in iOS:Perché i documenti indicano che le animazioni CALayer devono essere nei blocchi di animazione di UIView?

Se si desidera utilizzare le classi Core Animation di avviare le animazioni, è necessario rilasciare tutte le chiamate in Core Animation dall'interno di un blocco di animazione basato su vista. La classe UIView disattiva le animazioni di livello per impostazione predefinita, ma le riattiva all'interno dei blocchi di animazione. Quindi tutte le modifiche apportate al di fuori di un blocco di animazione non sono animate.

Appena sotto la citazione, la documentazione include l'elenco seguente codice:

[UIView animateWithDuration:1.0 animations:^{ 
    // Change the opacity implicitly. 
    myView.layer.opacity = 0.0; 

    // Change the position explicitly. 
    CABasicAnimation* theAnim = [CABasicAnimation animationWithKeyPath:@"position"]; 
    theAnim.fromValue = [NSValue valueWithCGPoint:myView.layer.position]; 
    theAnim.toValue = [NSValue valueWithCGPoint:myNewPosition]; 
    theAnim.duration = 3.0; 
    [myView.layer addAnimation:theAnim forKey:@"AnimateFrame"]; 
}]; 

il che implica che entrambe le animazioni implicite ed esplicite CALayer s supporto UIView s devono essere posizionati all'interno di un blocco di animazione.

Tuttavia, ho trovato questo per essere palesemente falso. Nello specifico, ho implementato con successo animazioni esplicite usando le classi Core Animation al di fuori di un blocco di animazione UIView.

Ho frainteso questo passaggio, o è scaduto, o qualcos'altro?


Alcune aggiunte:

I presuppongono che "la classe UIView disabilita animazioni strato di default ma li riattiva dentro blocchi animation" si riferisce al metodo +[UIView setAnimationsEnabled:]. Quando torno a un computer che può farlo, controllerò per vedere se +[UIView areAnimationsEnabled] restituisce YES o NO.

risposta

4

Questa citazione si riferisce al livello che supporta la vista. Non è vero per i livelli autonomi che crei e gestisci da solo.


Ogni vista su iOS è supportata da un livello. Quando si modificano le proprietà della vista, viene modificata la proprietà del livello sottostante. Di default il livello avrebbe animazioni implicite, ma il livello "disabilita" quel comportamento tranne quando ci si trova all'interno di un blocco di animazione UIView. Questo è ciò a cui si riferisce la parte della documentazione.

Ci sono un paio di modi in cui è possibile utilizzare Core Animation per animare una proprietà di livello. Il più comune è aggiungere l'oggetto animazione al livello quando si desidera animare la proprietà, ma è anche possibile effettuare personalizzazioni tramite il dizionario actions e il dizionario styles se si desidera sempre animare quando una proprietà cambia. Gli ultimi due sarebbero anche disabilitati per il livello che supporta una vista.

+0

Quindi stai dicendo che 'UIView' disabilita * l'animazione implicita * sui loro livelli di supporto (eccetto all'interno dei blocchi di animazione di' UIView'), ma continua a consentire animazioni esplicite? Se è così, questo differisce dalla documentazione, che sostiene che * tutte le chiamate di CA * devono essere all'interno di un blocco di animazione. – ravron

+0

Se questo è quello che dice, allora è sbagliato/mal scritto. Non è assolutamente vero. –

+0

@ravron Questo paragrafo si trova nella sezione "Come animare viste con supporto layer". Per me è stato abbastanza ovvio che si tratta di livelli che supportano un UIView. –

Problemi correlati