在单独的图层 - 目标c核心图形中绘制

时间:2009-12-30 15:17:45

标签: objective-c core-graphics

我正在使用核心图形为iphone开发图表应用程序。我的要求如下。 我已经在drawRect方法中实现了我的所有绘图函数。当图表中发生一些更新时,我需要调用[self setNeedsDisplay:true]并从开始调用drawRect方法。(意味着它执行drawRectMethod中的所有方法。所以当触摸时事件绘图不是很顺利。所以我需要在drawRect方法中绘制一些特定的部分而不是所有的部分。核心图形是否可以这样做?

1 个答案:

答案 0 :(得分:2)

目前还不清楚“单独的图层”是什么意思,但是根据你的问题我会假设你的意思是-drawRect:目前是一个很复杂的大型函数,它执行大量计算,因此运行速度太慢,因为它被召唤了很多。你没有提到CALayer,所以我假设你并不是指这里的实际图层。

解决方案是将您的计算移出-drawRect:。只有在数据实际发生变化时,您才应计算所需的一切。在-drawRect:中,您应该使用预先计算的值,这应该快得多。

例如,既然你提到了Core Graphics,我假设你正在使用像CGPath这样的东西。您应该仅在数据更改时计算CGPath,然后将CGPath存储在ivar中。您应该在-drawRect:绘制您的CGPath。如果CGPath特别复杂(因此很慢),您甚至可能希望将其预渲染为CGImage,然后只复合CGImage。

在iPhone上尽可能完全避免使用Core Graphics,而是在Photoshop中预渲染图像并将其保存在Resources文件夹中。 3G只是没有计算能力来跟上复杂的核心图形处理。这是苹果公司近期对Mac的建议的逆转,它不鼓励使用预渲染图像并鼓励渐变和路径,而且由于处理器速度要快得多,因此它不那么重要,但它仍然是目前推荐的iPhone,并且可能直到他们发布更高分辨率的iPhone显示器。如果您有动态图像,这当然是不可能的,但您应该记住静态图像。

修改

首先,如果可行,请确保您只绘制那些脏的部分。 -drawRect:传递一个脏矩形。如果特定元素与该矩形不相交,则无需重绘它。同样,您应该使用-setNeedsDisplayInRect:来指示哪些部分需要更新。如果您可以轻松地将视图分解为非重叠矩形(或偶尔重叠的矩形),那么这很有效。

如果您有一个由您想要独立计算的各种重叠组件构成的视图,那么您可以在CALayer上绘制每个视图,然后将这些图层附加到视图中(可能没有任何内容视图本身)。然后,您可以仅对已更改的图层调用-setNeedsDisplay。这是我可能用于垂直线的例子。我将创建CALayer视图的线宽和高度,将其背景颜色设置为线条颜色,并将其附加到所需位置的视图。然后移动线非常快(甚至使用变换旋转它),稍后移除线是微不足道的。如果您想要更精细的线条绘制(抗锯齿等),您当然可以使图层更宽,并实际在图层内部绘制线条。如果需要,该图层可以与视图一样大。

Core Animation Programming Guide有关于CALayer以及如何使用它的大量文档。