2008 05 21Core Animation Phantom Fade
Animating squares, this looks like that :
You're expecting layers to smoothly move to their new positions, but they're fading instead. Turns out it's because creation and animation are done in the same transaction. You're telling CA to create and animate, CA then tries to move from N objects to N+1 objects smoothly. It does that with a fade.
The fix
Do it in two transactions. Use a zero duration transaction for creating your layers, then animate them.
// Creation transaction, zero duration
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0] forKey:kCATransactionAnimationDuration];
[self addRect:NSMakeRect(0, 50, 90, 100)];
[CATransaction commit];
// Animation transaction, whatever duration you want
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
[self animateLayers];
[CATransaction commit];
You'll then see what you expected : smooth animation to the new positions.
Sample Code
Core Animation
- CocoaNav a Cocoa Class Browser using Core Animation
- Core Animation Starfield Core Animation sample using 3D layers
CoreAnimationStarfield.zip - Core Animation culling problems Don't setup a projection transform on the root layer !
- Threaded Core Animation while on the main thread, update your display with
[CATransaction commit]
CoreAnimationUpdateOnMainThread.zip - Core Animation Bindings binding Cocoa objects to
CALayer
s
Core Animation Bindings.zip - Core Animation Phantom Fade seeing ghosting ? Use two transaction to create and animate your objects
CoreAnimationPhantomFade.zip - Photoshop-like compositing with Core Animation
Blending Modes.zip
You can also extend CALayer with a new class that implements this. Sadly your site doesn't allow me to post code so here's my best description:
Override CALayer.defaultActionForKey and return a nil for key = 'sublayers'.
I ran into a similar problem -- thanks for sharing!