您要问的内容有三种方法。您可以在 中绘制所有内容drawRect:
,可以管理多个图层,也可以在图像中绘制。每个都有优点,但首先您需要正确考虑问题,以免破坏性能。
绘画不断发生。每次发生任何变化时,都可能需要进行大量绘图。通常不是整个屏幕,但仍然有很多绘图。由于drawRect:
并且drawInContext:
可以多次调用,因此它们需要高效。这意味着你不想做很多昂贵的计算,也不想做很多无用的绘图。“无用”的意思是“实际上不会显示,因为它不在屏幕上或被其他图形遮挡了。”
因此,在通常情况下,您将实际绘图代码放入 中drawRect:
,但您在其他地方进行所有计算,通常是在您的数据更改时。例如,每当您的数据更改时,您读取文件、计算坐标、创建 CGPath 等(这应该比绘图少得多)。您将所有结果保存到 ivars 中,然后在drawRect:
其中绘制最终结果。因此,在您的循环示例中,您的视图对象中可能会有一个 NSArray 图像,并且drawRect:
您会按顺序绘制它们。
另一种方法是为每个图像创建一个单独的图层,将图像设置为内容,然后将图层附加到视图。你已经完成了。您不再需要编写绘图代码。Quartz 非常有效地处理图层,因此这可以很好地解决各种问题。
最后,您可以将所有内容合成为图像,然后将该图像粘贴到图像视图中,或者直接在视图中绘制图像,或者将图像附加到图层。如果您有非常复杂的绘图(特别是使用 CGPath),这是一个很好的解决方案。如果您不断更改内容,这可能会很昂贵,因为您必须创建一个新的图像上下文,将旧图像绘制到新的上下文中,在它上面绘制,然后从上下文中创建一个新的图像。但这对于不经常更改的复杂绘图很有用。
但你是对的,CGContext 不像画布。它需要在每个绘制周期重新绘制。您可以自己做,也可以使用另一个视图对象(如 UIImageView)为您做。但它必须以一种或另一种方式完成。