【问题标题】:What way to use the CGContext to draw is suitable?用CGContext画什么方式合适?
【发布时间】:2010-04-12 13:30:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c quartz-graphics cgcontext


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我没有得到CGContext的想法,为什么Apple不实现一个画布来代替,我认为它更容易理解。我的情况是我会使用 CGContext 做一些动画的东西,你认为多层适合我吗?
    • 对于您描述合成各种图像的位置的情况,多层可能是一个好方法。动画对图层非常有效。
    • @Tattat:绘图过程的设计与内容在 Mac 和 iPhone 上的屏幕呈现方式有关。像您使用 HTML5 画布标记和 Java Swing 所做的增量绘图并不是这些设备的最佳方法,因此 Apple 使用了不同的方法。如果您认为您的视图是缓存位图,您必须随着绘图更改重新缓存,绘图系统变得更容易理解。
    • @Rob Napier,所以...与其直接在 CGContext 中绘制,我应该使用“CGLayer”吗? o 实施? @Brad Larson,呃……我明白了。所以,我有一个关于苹果方法的问题。 HTML5 画布/Java Swing 可以在当前绘图之上添加更多内容。例如,我有两件事要绘制。我画了一条线,画了一个圆。在 HTML5 canvas/Java Swing 中,我先画一条线,然后再画一个圆。但是在苹果的方法中,我缓存了线和圆,一步一步画出来。对吗?
    • @Rob Napier,遵循 Apple 的做法。如果我制作一个应用程序,例如画布。我需要不断重绘整个图像,而不是在上面添加新东西。你不认为它使用更多资源吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多