objective-c - [CALayer drawInContext] 重影

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

我使用 CALayer 的自定义扩展绘制为可滚动图形,并在 [MyCustomCALayer drawInContext] 中调用了一堆 CGContextAddCurveToPoint

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

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

但是,每当我在平移过程中重新绘制图层时,都会出现这种奇怪的重影。稍微搜索一下表明它可能是 implicit animation通过重绘层的内容调用,但我找不到明确的答案。

这是图表在静止时的样子: At rest

这是在平移过程中重绘重绘: During panning

当然,当我确实绘制整个图形并调整图层的 position 属性以进行平移时,它不是重影,但内存中有一个又大又长的位图似乎很糟糕东西。

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

最佳答案

它可能是一个隐式动画。重绘(内容更改)像 Core Animation 中的其他所有内容一样进行动画处理。

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

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

    return [super actionForKey: key];
}

关于objective-c - [CALayer drawInContext] 重影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10728593/

相关文章:

ios - 如何正确拖放、旋转和缩放 UIView?

macos - 如何衡量Mac应用程序的图形性能?

ios - CABasicAnimation 不在 CAShapeLayer 上设置动画

ios - 在 Objective-C 中混合 block 和委托(delegate)

objective-c - InitWith 方法与工厂方法

ios - 在窗口前添加一个 ViewController!.UITabBarController Swift 4 类型的 rootViewController

ios - sqlite方法有什么问题

ios - 如何使用滚动动画关注 UITableview 中的最后一个单元格?

ios - 使用 CAAnimation.CurrentMediaTime() 更改显式动画的速度

ios - ios如何截取不可见部分的屏幕截图?