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

Macos 当窗口调整大小或移动(拖动)到辅助显示器(监视器)时,为什么自定义NSView会重新绘制?,macos,nsview,xcode10,swift4.2,redraw,Macos,Nsview,Xcode10,Swift4.2,Redraw,我最近开始在自己编写的MacOS应用程序中添加图形图表。第一个图表很好,我添加了第二个图表,其中我遇到了代码运行的基本方式,但我不理解。我遇到这个问题的唯一原因是,在我的第二张图表中,我使用了random在封闭区域内绘制了一些气泡。它工作得很好,但是当我稍微调整视图窗口的大小时,图表会重新绘制所有内容,因为我使用的是随机的,所以第一组气泡保留在屏幕上,第二组气泡添加到屏幕上。所以我举了一个简单的例子来说明 class GraphView: NSView { var dcnt = 0

我最近开始在自己编写的MacOS应用程序中添加图形图表。第一个图表很好,我添加了第二个图表,其中我遇到了代码运行的基本方式,但我不理解。我遇到这个问题的唯一原因是,在我的第二张图表中,我使用了random在封闭区域内绘制了一些气泡。它工作得很好,但是当我稍微调整视图窗口的大小时,图表会重新绘制所有内容,因为我使用的是随机的,所以第一组气泡保留在屏幕上,第二组气泡添加到屏幕上。所以我举了一个简单的例子来说明


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运行的。我添加了一个计数器来打印出来,看看发生了什么。此外,如果我将图表/视图窗口拖到另一个监视器上,它也会强制重新绘制

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

下面是一个将图表拖动到辅助监视器时发生的示例

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

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

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

您不能,
draw
被多次调用

我想画图表,就这样

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

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


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

调整窗口大小时,视图或其超级视图是否调整大小?@Willeke。在我正在进行的测试中,我在Interface Builder中关闭了ViewController和自定义视图的该功能,当我将窗口/视图拖到第二个监视器上时,问题仍然存在。当我拖回第一个监视器时,它再次发生。最初在我的应用程序中,气泡图处于禁用状态,我在ViewDidAspect()中使用self.view.window?.styleMask.remove(NSWindow.styleMask.resizable)在ViewController中禁用了调整大小。在我将图表移到另一个监视器之前,这一切都起了作用。@Willeke和调整图表本身的大小不是我代码的一个方面。我只想写一次,不需要图表随着窗口的大小而伸缩。我确实想学怎么做,但不是现在。我现在正在进一步研究如何处理上下文,并研究如何将PDF文件写入静态查看。我已经解决了上面气泡图中多次重复出现的问题。现在我已经使用了上下文,我明白了为什么将图表/视图拖到另一个显示器上会强制重画。我仍然想知道是否有办法阻止这一切。我还认为,当我最终转向Big Sur和UIKit的macos实现时,我将能够以不同的方式工作。所以,我现在就让它开着。