Parmanoir

Core Animation Phantom Fade

Have you ever seen ghosting when creating layers and animating them to a new position ? I have, and I've been puzzled. In CocoaNav, the frameworks gradually move to the back, and once they're loaded they all move up front on the same plane. Once I messed up so bad to actually see Core Animation fading between the two positions !

Animating squares, this looks like that :

Image:Core Animation Phantom Fade.png

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

Image:iconZip.png CoreAnimationPhantomFade.zip

Core Animation

Dan Waylonis
2008 11 26

I ran into a similar problem -- thanks for sharing!

Anthony Stevens
2012 02 09

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'.


Follow me on Twitter
Planet Cocoa
Cocoa.fr

2011 02 22Distance field
2010 07 202Binding through NSApp
2010 05 122Forwarding invocations
2010 02 272Core Image black fringes
2010 02 21Quickest Way to Shell
2010 02 08Who's calling ?
2009 09 2138 ways to use Blocks in Snow Leopard
2009 08 182Bracket Mess
2009 08 124Taming JavascriptCore within and without WebView
2009 04 15Debugging with Activity Monitor
2009 03 25How Core Image Color Tracking works
2009 03 1510Custom NSThemeFrame
2009 03 10Which framework is running ?
2009 03 074CoreUI can paint pretty big
2009 02 18Localization with functions
2009 01 30Did you forget to nest alloc and init?
2009 01 16JSCocoa on the iPhone
2009 01 11Mixing WebView and JavascriptCore
2009 01 09Badge overflow
2009 01 09Find your Garbage Collection leaks with Instruments

Powered by MediaWiki