我正在子类CALayer,以提供我自己的绘图方法。为了进行优化,我调用-[MyLayer setNeedsDisplayInRect:]而不是-[MyLayer setNeedsDisplay]。在绘图方法中,我得到了应该通过CGContextGetClipBoundingBox()重新绘制的rect。
如果我使用这个层作为UIView的基本层,那么每一件事情都会像预期的那样工作。一旦我将我的自定义层用作另一个CALayer的子层,问题就会出现。而不是CGContextGetClipBoundingBox(),总是返回该层边界的rect。
有什么想法吗?
编辑
看起来,没有保证,CALayer的内容被缓存,只有脏的部分被重新绘制。我做了一个小测试,并将需要显示为单独属性的rect存储起来。结果是,只有这个部分在屏幕上可见。
现在,我将呈现给图像上下文,并将该图像作为缓存保存。在绘图方法中,我只显示缓存的图像。
发布于 2012-10-25 04:12:21
令人遗憾的是,苹果的文档是矛盾的,因为-setNeedsDisplayInRect上的文档并不表示该方法在实践中是否有效。根据我自己的经验,这个technote澄清了这一点:
请注意,由于iPhone/iPod /iPad更新屏幕的方式,如果您调用-setNeedsDisplayInRect:或-setNeedsDisplay:,整个视图将被重新绘制。
话虽如此,如果你认为你因为多余的绘画而撞上了一堵墙,你可以观察很多事情。
shouldRasterize属性在CALayer上。如果您试图操作一个子层可能构成复杂层层次结构的层,这可能是天赐之物。一定要通过在核心动画工具中勾选Color Hits Green and Misses Red框来检查你在乐器方面的表现。如果你看到很多红色的东西,那么使用shouldRasterize的几率比它所起的作用更大。shouldRasterize更好的是平平您的层层次结构,因为这样您就可以避免shouldRasterize在实时平整您的层层次结构时所带来的额外开销。当然,这并不总是可能的,但不要害怕尝试:)如果我说的话没什么意义的话,请随时问进一步的问题。
https://stackoverflow.com/questions/9809306
复制相似问题