[CALayer drawInContext]中的重影

Hen*_*oke 3 core-animation objective-c calayer quartz-graphics ios

我使用自定义扩展程序绘制可滚动图形,CALayer其中包含一系列CGContextAddCurveToPoint调用[ MyCustomCALayer drawInContext].

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

[ MyCustomCALayer setNeedsDisplay ]在图形数据更改或平移偏移更改时[ MyCustomCALayer drawInContext]调用,然后调用它.

但是,每当我在平移过程中重绘图层时,我都会遇到这种奇怪的重影.一些搜索建议它可能是通过重绘图层的内容调用的隐式动画,但我找不到明确的答案.

以下是图表在休息时的样子: 在休息

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

当然,当我画全图表和调整图层的position属性进行平移它没有重影,但在内存中一个很长的位图看起来是一件坏事.

以前有人见过这种重影吗?如果它(我怀疑)是隐式动画,我该如何禁用所述动画?

joe*_*ick 8

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

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

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

    return [super actionForKey: key];
}
Run Code Online (Sandbox Code Playgroud)