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

Tat*_*tat 0 objective-c quartz-graphics cgcontext

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

为什么我不能画一个循环?(在iPhone中使用UIView)

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

Rob*_*ier 6

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

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

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

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

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

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