是否可以在drawInContext调用之间保留CALayer的内容?

时间:2012-06-28 15:38:57

标签: ios core-animation calayer

是否有任何内置功能可以在drawLayer:inContext:calls之间维护CALayer的内容?现在我正在将图层复制到缓冲区并每次在drawLayer:inContext中回调时从缓冲区重绘图像:但我想知道CALayer是否有办法自动执行此操作...

1 个答案:

答案 0 :(得分:0)

我不相信。 'drawInContext'将清除底层缓冲区,以便您可以绘制它。但是,如果您放弃drawInContextdrawRect方法,则可以将layer.contents设置为CGImage并保留。

我亲自为几乎所有惯例做这件事。我覆盖- (void) setFrame:(CGRect)frame以检查帧大小是否已更改。如果它已更改,我使用我的常规绘图例程重绘图像,但进入上下文:UIGraphicsBeginImageContextWithOptions(size, _opaque, 0);。然后,我可以抓取该图像并将其设置为imageCache:cachedImage = UIGraphicsGetImageFromCurrentImageContext();。然后我将layer.Contents设置为CGImage。我使用它来帮助缓存我的绘图,特别是在新的iPad上,这在iPad 2甚至没有闪烁的许多绘图程序上都很慢。

此方法的其他优点:如果设置单独的共享缓存,则可以在视图之间共享缓存的图像。如果您很好地管理缓存,这可以真正帮助您的内存占用。 (提示:我使用NSStringFromCGSize作为共享图像的字典键)。此外,您实际上可以在不同的线程上剥离绘图例程,然后在完成后设置图层内容。这可以防止您的绘图例程阻塞主线程(在这种情况下,当前图像可能会被拉伸,直到设置新图像为止)。