使用CGContext绘制的方式是合适的?

时间:2010-04-12 13:30:03

标签: objective-c quartz-graphics cgcontext

我知道CGContext不能直接调用它,它需要在drawInContext中填充绘图逻辑,并使用“setNeedsDisplay”调用CGContext进行绘制,因此,我设计了一个cmd来执行,但它导致一些问题......像这样:

Why I can't draw in a loop? (Using UIView in iPhone)

我认为CGContext与我以前的编程经验非常不同....(我使用HTML5画布,允许我添加更多细节,在绘制之后,Java Swing也是如此) 实际上,我想知道在Apples的程序员心中有什么适合实现这类东西。太赫兹。

1 个答案:

答案 0 :(得分:6)

您要问的方法有三种。您可以在drawRect:中绘制所有内容,可以管理多个图层,也可以在图像中绘制。每个都有优势,但首先你需要正确思考问题,这样你就不会破坏性能。

绘画经常发生。每当有任何变化时,可能会有相当多的绘图需要完成。通常不是整个屏幕,但仍然有很多绘图。由于drawRect:drawInContext:可以被多次调用,因此它们需要高效。这意味着你不想做很多昂贵的计算,而且你不想做很多无用的绘图。 “无用”意味着“实际上不会显示,因为它在屏幕外或被其他绘图遮挡。”

因此,在通常的情况下,您将实际绘图代码放在drawRect:中,但是您可以在其他地方进行所有计算,通常是在数据发生变化时。例如,每当数据发生变化时,您都会读取文件,找出坐标,创建CGPath等(这应该比绘图时少得多)。将所有结果保存到ivars中,然后在drawRect:中绘制最终结果。因此,在循环示例中,您可能在视图对象中有一个NSArray图像,而在drawRect:中,您可以按顺序绘制它们。

另一种方法是为每个图像创建单独的图层,将图像设置为内容,然后将图层附加到视图。那时你已经完成了。您无需编写任何绘图代码。 Quartz非常有效地处理图层,因此这可以很好地解决各种各样的问题。

最后,您可以将所有内容合成到图像中,然后将该图像粘贴到图像视图中,或者直接在视图中绘制图像,或将图像附加到图层。如果您有非常复杂的绘图(特别是使用CGPath),这是一个很好的解决方案。如果你经常改变东西,这可能会很昂贵,因为你必须创建一个新的图像上下文,将旧图像绘制到新的上下文中,在它上面绘制,然后从上下文创建一个新图像。但这对于经常不会改变的复杂绘图是有益的。

但你是对的,CGContext不像画布。每个绘制周期都需要重绘。你可以自己做,或者你可以使用另一个视图对象(如UIImageView)为你做。但它必须以这样或那样的方式完成。