0

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

为什么我不能循环绘制?(在 iPhone 中使用 UIView)

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

4

1 回答 1

6

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

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

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

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

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

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

于 2010-04-12T13:50:39.710 回答