我有一个自定义NSView绘制(带有-drawRect
)图形。它还跟踪鼠标位置(使用-mouseMoved
等)并绘制相对于轴的光标位置/坐标。
图形很大并且(可能)绘制缓慢,并且不依赖于鼠标位置。鼠标悬停效果很小,并且总是快速绘制。当鼠标移动几个像素时,我不想重绘所有内容,因为它感觉很迟钝。
我确定我可以创建自己的私有图形上下文(如果在2倍显示器上增加一倍),将图表数据绘制到那一次,然后让-drawRect
简单地将其插入到查看图纸上下文。或者,我可以将我的NSView子类拆分为两个类,并且只有一个图表数据,一个只是叠加层,并将它们完全放在彼此之上(尽管它们必须共享一些数据,所以这看起来很尴尬)。
是否有内置的方法可以让这更容易,还是有一种更惯用的处理方法?
答案 0 :(得分:0)
看看这些NSWindow方法:
包围绘图操作 - cacheImageInRect: - restoreCachedImage - discardCachedImage
通常,使用视图,您可以定义一个drawRect:方法,该方法可以按需绘制内容。但是,您可以根据事件在视图中进行现场绘制,例如,将焦点锁定在视图上,执行绘图,然后解锁焦点。在这个现场绘图中缺少的链接,在某种程度上撤消它而不调用你可能很重的drawRect:via setNeedsDisplay:
这是NSWindow的Bracketed绘图操作发挥作用的地方。在将焦点锁定在视图上并进行一些现场绘制之前,请在要绘制的区域中缓存视图的图像。当您下次想要更新图形时(可能跟踪事件),然后恢复缓存的图像,冲洗并重复。