3

我正在使用CALayer带有一堆CGContextAddCurveToPoint调用的自定义扩展来绘制可滚动图形[ MyCustomCALayer drawInContext]

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

[ MyCustomCALayer setNeedsDisplay ]当图形数据改变或平移偏移量改变时被调用,然后导致[ MyCustomCALayer drawInContext]被调用。

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

这是图表在静止时的样子: 在休息

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

当然,当我绘制整个图形并调整图层的position属性以平移时,它不是重影,但是在内存中拥有一个又大又长的位图似乎是一件坏事。

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

4

2 回答 2

8

它可能是一个隐式动画。重绘(内容的变化)与 Core Animation 中的其他所有内容一样具有动画效果。

有很多方法可以防止这种情况发生,如果您将 CALayer 子类化以进行绘图,最好是覆盖 -[CALayer actionForKey:],返回 nil 以更改内容:

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

    return [super actionForKey: key];
}
于 2012-05-23T22:17:51.687 回答
2

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

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

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

编辑:

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

于 2012-05-24T00:27:42.843 回答