2011-02-08 12 views
5

Oto mój kod animacji:CATransformLayer nie obsługuje niejawnej animacji?

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 jest CATransformLayer dwie podwarstwy, po jednym dla przodu i jeden do tyłu (Tworzę „flip” efekt). Jednak ten kod po prostu ustawia pozycję i transformuje się bez animacji. Pomyślałem więc, że być może transform nie obsługuje niejawnej animacji, więc wyjąłem to i próbowałem ustawić pozycję, ale to też nie było animowane (i wiem na pewno, że position obsługuje niejawną animację).

Czy robię coś złego, czy też nie obsługuję niejawnej animacji? Dokumentacja nie mówi nic o tym, nie wspierając go, więc zakładam, że tak.

EDIT: To jest dla systemu Mac OS X, nie iOS

+0

Czy próbowałeś użyć wyraźnej animacji? –

Odpowiedz

1

Skończyło się na tym, że korzystałem z wyraźnej animacji, ale odpowiedź Davida Duncana here wydaje się krokiem we właściwym kierunku dla każdego, kto napotka na ten problem.

0

niejawne animacje są wyłączone dla wszystkich warstw związanych z UIView s. Mam dużo więcej detailed response w innym pytaniu, jeśli jesteś ciekawy szczegółów. Krótko mówiąc, jeśli chcesz animacje na warstwie powiązanej z widokiem, musisz zrobić je jawnie (tj. Dołączyć obiekty CAAnimation przy użyciu -addAnimation:forKey:).

Edycja: Okazuje się, że to pytanie dotyczy OS X, a CATransformLayer tak naprawdę jest podwarstwą. Odrzuć tę odpowiedź (chociaż połączona odpowiedź jest nadal przydatna w przypadku iOS).

+0

To nie jest na iOS, ale na Mac OS X. Powinienem był to wyjaśnić w moim poście. Warstwa transformacji jest podwarstwą warstwy widoku (widok jest widokiem hostingu warstwy). – indragie

+0

Ah hah. W takim razie nie wiem. Przepraszam. –

0

Wyświetlane są tylko podwarstwy z CATransformLayer. Zgaduję więc, że jego właściwość transform nigdy nie jest stosowana. Czy próbowałeś już ustawić właściwość sublayerTransform? Wygląda na to, że tak właśnie się dzieje.

+0

Zgodnie z pytaniem, jego kod ustawia transformację, po prostu nie animuje. –

+0

Ups. Tęskniłem za tym. Może "CATransformLayer" nie obsługuje animowania żadnej z jego właściwości? –

0

Jeśli dodasz warstwę i spróbujesz ją ożywić w tej samej pętli, animacja nie nastąpi - nastąpi natychmiast. Musisz owinąć dodając warstwę w CATransaction. Następnie możesz animować w sposób dorozumiany lub jawny. Na przykład powinno to zadziałać:

[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;