[CALayer drawInContext]中的重影

时间:2012-05-23 22:09:32

标签: objective-c ios core-animation calayer quartz-graphics

我使用CALayer的自定义扩展程序绘制为可滚动图表,并在CGContextAddCurveToPoint中进行了大量[ MyCustomCALayer drawInContext]次调用。

我实际上并没有绘制图形的整个长度,而是每次UIPanGestureRecognizer更新时我都会重新绘制图层的内容以反映新的水平偏移。这样,我只绘制图形的可见部分,图层的边界只扩展到屏幕的大小。

当图形数据发生变化或平移偏移发生变化时,会调用

[ MyCustomCALayer setNeedsDisplay ],然后调用[ MyCustomCALayer drawInContext]

然而,每当我在平移过程中重绘图层时,我都会遇到这种奇怪的重影。通过重新绘制图层的内容进行了一些搜索,表明它可能是implicit animation,但我无法找到明确的答案。

这是图表在休息时的样子: At rest

这是在平移期间,重影重绘: During panning

当然,当我绘制整个图形并调整图层的position属性来平移它不是鬼影,但在内存中有一个很长的长位图看起来像是坏事。 / p>

有没有人见过这种鬼影?如果它(我怀疑)是一个隐式动画,我怎么能禁用所说的动画?

2 个答案:

答案 0 :(得分:8)

它可能是一个隐式动画。重绘(内容更改)与Core Animation中的其他内容一样动画。

有很多方法可以防止这种情况,如果你是继承CALayer进行绘图,最好是覆盖 - [CALayer actionForKey:],返回nil以改变内容:

- (id<CAAction>)actionForKey:(NSString *)key 
{
    if ([key isEqualToString: @"contents"]) 
    {
        return nil;
    }

    return [super actionForKey: key];
}

答案 1 :(得分:2)

另一种禁用隐式动画的技巧是:

    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

如果禁用隐式动画并不这样做,那么您可以考虑使用滚动视图并在大视图中绘制整个视图,然后是该滚动视图的内容。

编辑:

我忘了提到该方法要求您在CATransaction块中进行修改