5

Ecco il mio codice di animazione:CATransformLayer non supporta l'animazione implicita?

CGFloat zDistance = 850; 
CGFloat scaleFactor = BACK_COVER_WIDTH/self.transformLayer.bounds.size.width; 
CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0); 
CATransform3D scale = CATransform3DMakeScale(scaleFactor, scaleFactor, 0.0); 
CATransform3D transform = CATransform3DConcat(rotation, scale); 
transform.m34 = 1.0/-zDistance; 
CGPoint location = CGPointMake(CGRectGetMidX(self.layer.frame), CGRectGetMidY(self.layer.frame)); 
[CATransaction begin]; 
[CATransaction setAnimationDuration:1.0]; 
self.transformLayer.transform = transform; 
self.transformLayer.position = location; 
[CATransaction commit]; 

self.transformLayer è un CATransformLayer con due sottolivelli, uno per la parte anteriore e uno per la parte posteriore (Sto creando un effetto "flip"). Tuttavia, questo codice imposta solo la posizione e trasforma senza animazione. Quindi ho pensato che forse transform non supporta l'animazione implicita, quindi l'ho tolto e ho appena provato a impostare la posizione, ma non l'animazione (e so per certo che position supporta l'animazione implicita).

Sto facendo qualcosa di sbagliato o CATransformLayer non supporta l'animazione implicita? La documentazione non dice nulla a riguardo, non lo supporta, quindi presumo che lo faccia.

EDIT: Questo è per Mac OS X, non iOS

+0

Hai provato a utilizzare un'animazione esplicita? –

risposta

1

Ho finito per usare solo l'animazione esplicita, ma la risposta di David Duncan here sembra un passo nella giusta direzione per chiunque incontrasse questo problema.

0

animazioni impliciti sono disabilitate per tutti i livelli associati a UIView s. Ho un altro detailed response su un'altra domanda se sei curioso di sapere i dettagli. Ma in breve, se desideri animazioni su un livello associato a una vista, devi eseguirle esplicitamente (ad esempio allegare oggetti CAAnimation usando -addAnimation:forKey:).

Modifica: Risulta che questa domanda è per OS X e CATransformLayer è in realtà un sottolivello in ogni caso. Si prega di ignorare questa risposta (anche se la risposta collegata è ancora utile per iOS).

+0

Questo non è per iOS, è per Mac OS X. Avrei dovuto renderlo più chiaro nel mio post. Il livello di trasformazione è un sottolivello del livello della vista (la vista è un livello che ospita la vista). – indragie

+0

Ah ah. In tal caso, non lo so. Scusate. –

0

Vengono visualizzati solo i sottolivelli di un CATransformLayer. Quindi la mia ipotesi è che la sua proprietà transform non venga mai applicata. Hai provato a impostare la proprietà sublayerTransform? Sembra che sia quello che stai andando comunque.

+0

Secondo la domanda, il suo codice imposta la trasformazione, semplicemente non si anima. –

+0

Oops. Mi sono perso in qualche modo. Forse 'CATransformLayer' non supporta l'animazione di nessuna delle sue proprietà? –

0

Se si aggiunge un livello e si tenta di animarlo nello stesso ciclo di esecuzione, l'animazione non si verificherà, ma si verificherà immediatamente. Devi completare l'aggiunta del livello in una CATransaction. Successivamente, è possibile animare implicitamente o esplicitamente. Ad esempio, questo dovrebbe funzionare:

[CATransaction begin]; 
[self.view.layer addSublayer:transformLayer]; 
[CATransaction commit]; 

// implicit animation will now occur because we're in the next run loop 
transformLayer.transform = newTransform;