Ghosting in [CALayer drawInContext]
calayer, core-animation, ios, objective-c, quartz-graphics
Solution
It will probably be an implicit animation. Redraws (changes in contents) are animated like everything else in Core Animation.
There are a number of ways to prevent this, if you're subclassing CALayer to do the drawing the best is to override -[CALayer actionForKey:], returning nil for change in contents:
- (id<CAAction>)actionForKey:(NSString *)key
{
if ([key isEqualToString: @"contents"])
{
return nil;
}
return [super actionForKey: key];
}
Problem
I'm drawing as scrollable graph using a custom extension of `CALayer` with a bunch of `CGContextAddCurveToPoint` calls in `[ MyCustomCALayer drawInContext]`. I'm not actually drawing the whole length of the graph, rather, I'm redrawing the contents of the layer every time a `UIPanGestureRecognizer` updates to reflect the new horizontal offset. This way, I only draw the visible portion of the graph, and the layer's bounds only extend to the size of the screen. `[ MyCustomCALayer setNeedsDisplay ]` gets called when graph data changes or the pan offset changes, which then causes `[ MyCustomCALayer drawInContext]` to be invoked. However, I'm getting this weird ghosting whenever I redraw my layer during panning. A bit of searching around suggests it might be an implicit animation invoked by redrawing the layer's content, but I can't find a definitive answer. Here's what the graph looks like at rest: And here it is during panning, with the ghosting redraw: Certainly, when I do draw the whole graph and adjust the layer's `position` property to pan it's not ghosting, but having a big long bitmap in memory seems like a Bad Thing. Has anyone seen this kind of ghosting before? If it is (as I suspect) an implicit animation, how can I disable said animation?