是否有任何内置功能可以在 drawLayer:inContext: 调用之间维护 CALayer 的内容?现在我正在将图层复制到缓冲区并在每次调用 drawLayer:inContext: 时从缓冲区重新绘制图像,但我想知道 CALayer 是否有办法自动执行此操作......
1 回答
我不相信。'drawInContext' 将清除底层缓冲区,以便您可以绘制到它。但是,如果您放弃drawInContext
ordrawRect
方法,您可以将 layer.contents 设置为 CGImage 并且将被保留。
我个人几乎在我所有的日常生活中都这样做。我覆盖- (void) setFrame:(CGRect)frame
以检查帧大小是否已更改。如果它发生了变化,我会使用我的正常绘图例程重新绘制图像,但要在上下文中:UIGraphicsBeginImageContextWithOptions(size, _opaque, 0);
. 然后我可以抓取该图像并将其设置为 imageCache: cachedImage = UIGraphicsGetImageFromCurrentImageContext();
。然后我将 layer.Contents 设置为 CGImage。我使用它来帮助缓存我的绘图,尤其是在 iPad 2 甚至不会闪烁的许多绘图例程上运行缓慢的新 iPad 上。
此方法的其他优点:如果您设置单独的共享缓存,则可以在视图之间共享缓存的图像。如果您管理好缓存,这确实可以帮助您减少内存占用。(提示:我使用 NSStringFromCGSize 作为共享图像的字典键)。此外,您实际上可以在不同的线程上分离您的绘图例程,然后在完成后设置您的图层内容。这可以防止您的绘图例程阻塞主线程(在这种情况下,当前图像可能会被拉伸,但直到设置新图像)。