CATransformLayer doesn't support implicit animation?

1.2k views Asked by At

Here's my animation code:

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 is a CATransformLayer with two sublayers, one for the front and one for the back (I'm creating a "flip" effect). However, this code just sets the position and transform without animation. So I thought that maybe transform doesn't support implicit animation, so I took that out and just tried setting the position, but that didn't animate either (and I know for sure that position supports implicit animation).

Am I doing something wrong or does CATransformLayer just not support implicit animation? The documentation does not say anything about it not supporting it, so I'm assuming it does.

EDIT: This is for Mac OS X, not iOS

4

There are 4 answers

0
indragie On BEST ANSWER

I ended up just using explicit animation, but David Duncan's answer here seems like a step in the right direction for anyone else who comes across this issue.

2
Lily Ballard On

Implicit animations are disabled for all layers associated with UIViews. I have a much more detailed response on another question if you're curious as to the details. But in short, if you want animations on a layer associated with a view, you need to do them explicitly (i.e. attach CAAnimation objects using -addAnimation:forKey:).

Edit: It turns out this question is for OS X, and the CATransformLayer is actually a sublayer anyway. Please disregard this answer (though the linked answer is still useful for iOS).

2
Nathan Eror On

Only the sublayers of a CATransformLayer are rendered. So my guess is that its transform property is never applied. Have you tried setting the sublayerTransform property instead? It seems like that's what you're going for anyway.

0
Manesh On

If you add a layer and try to animate it in the same run loop, the animation won't happen - it'll occur instantly. You need to wrap adding the layer in a CATransaction. Afterwards, you can either implicitly or explicitly animate. For example, this should work:

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