【问题标题】:Custom Draw in NSView without erasing the previous background在 NSView 中自定义绘制而不擦除以前的背景
【发布时间】:2012-01-04 13:12:15
【问题描述】:

我正在尝试使用 Quartz 函数在自定义视图上动态绘制几个点,以便获得完整的图表。我在自定义视图的 drawRect 方法中处理线条的绘制,在该方法中我获取当前上下文并绘制线条。但是,当我尝试画一条新线时,它们会被删除。我希望这些线条与绘制的新线条一起可见。请让我知道如何做到这一点。我无法将所有点存储在一起并在最后绘制。我想不断更新我的观点。提前致谢。

【问题讨论】:

    标签: macos quartz-graphics nsview


    【解决方案1】:

    为您的自定义视图添加一个方法:

    - (BOOL) isOpaque { return YES; }
    

    这将阻止在你的后面绘制任何视图,包括背景。

    但是,请注意,在调整大小时,您需要以任何一种方式重新绘制所有内容。更合适的解决方案是使用屏幕外的图像来代替。

    【讨论】:

    • 谢谢。这就是我要找的。通过离屏图像绘制,你的意思是说,我应该得到一个 NSBitmapImageRep 对象,继续在其中绘制并将其显示在当前图形上下文中。是你的意思还是我理解错误。
    • 以下步骤是否意味着“离屏绘图”?拥有一个 NSImageView,使用“CGBitmapContextCreate”创建一个新上下文,在该上下文上绘制我想要的任何内容,从中创建一个 NSBitmapImageRep,然后创建一个 NSImage 并使用 setImage 将其设置为视图?
    【解决方案2】:

    您可以使用 CALayers:每当您有新数据时,将一个新的子层添加到根,然后绘制到该层。您的绘图代码可以保持不变:您只需输入用于创建和使用图层的代码,这实际上非常简单。
    见:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004514

    【讨论】:

    • 拥有 n 层是一个好习惯吗?在这种情况下,我可能需要绘制大约 100 个子图层。没事吧?
    • 我听说你可以同时在屏幕上显示数千个图层,所以这应该不是问题。但是,如果您只是创建合成图像,并且不需要图层可能提供的灵活性,那么 Simon 的建议可能是可行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2015-11-13
    相关资源
    最近更新 更多