为什么在调整窗口大小或移动拖动到辅助显示监视器时自定义 NSView 会重绘?

问题描述

我最近开始向我编写的 MacOS 应用程序添加图形图表。第一个图表很棒,我添加了第二个图表,在那里我遇到了我不/不理解的代码运行的基本方式。我遇到这个的唯一原因是因为在我的第二张图表中,我使用随机在有限区域内绘制了一些气泡。它工作得很好,但是当我稍微调整视图窗口的大小时,图表重新绘制了所有内容,并且由于我使用的是随机的,因此第一组气泡保留在屏幕中,第二组气泡被添加到屏幕中。所以我做了一个简单的例子来说明。


class GraphView: NSView {
    var dcnt = 0

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        dcnt+=1
        print(dcnt)
        let path = NSBezierPath(rect: self.bounds)
        var rec = NSRect()
        var circ = NSBezierPath()

        NSColor.lightGray.setFill()
        path.fill()

        rec = NSRect(x:Int.random(in: 100...900),y:Int.random(in: 70...560),width:50,height:50)
        NSColor.red.setFill()
        circ = NSBezierPath(ovalIn: rec)
        circ.fill()
        circ.stroke()
    }
}

这是从一个调用 GraphView 的简单 ViewController 运行的。我添加一个计数器来打印出来,看看发生了什么。此外,如果我将图表/视图窗口拖到第二个监视器上,它也会强制重绘。

我如何阻止这种情况发生。我想绘制图表,就是这样。没有单击、拖动、调整大小(我已禁用调整窗口大小)应重绘任何内容

以下是我将图表拖动到辅助监视器时发生的情况的示例...

enter image description here

解决方法

当窗口调整大小或移动(拖动)到辅助显示(监视器)时,为什么自定义 NSView 会重绘?

窗口大小调整会导致视图大小调整。辅助显示器可能具有不同的分辨率。

我如何阻止这种情况发生。

不能,draw 被多次调用。

我想绘制图表,仅此而已。

创建图表的 NSImage 并将其显示在 NSimageView 中。

第一组气泡留在屏幕上,第二组气泡被添加到屏幕上

在创建视图时计算一次圆的坐标或矩形,这样 draw 将始终绘制相同的圆。