【问题标题】:Why does custom NSView redraw when window is resized or moved (drag) to an secondary display (monitor)?当窗口调整大小或移动(拖动)到辅助显示器(监视器)时,为什么自定义 NSView 会重绘?
【发布时间】:2021-07-23 00:53:15
【问题描述】:

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

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

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

【问题讨论】:

  • 调整窗口大小时,视图或其父视图之一是否调整大小?
  • @Willeke。在我正在进行的测试中,我在 Interface Builder 中为 ViewController 和自定义视图关闭了该功能,当我将窗口/视图拖到第二个监视器时问题仍然存在。当我拖回第一台显示器时,它再次发生。最初在我的应用程序中,气泡图位于我在 ViewDidAppear() 中使用 self.view.window?.styleMask.remove(NSWindow.StyleMask.resizable) 在 ViewController 中禁用调整大小。这很有效,直到我将图表移到另一台显示器上。
  • @Willeke 调整图表本身的大小并不是我的代码的一个方面。我只想写一次,并且不需要图表在调整窗口大小时拉伸和增长或缩小。我确实想学习如何做到这一点,但不是现在。我现在正在进一步推动使用 Contexts 并研究写入 PDF 以进行静态查看。
  • 我已经解决了我在上面的气泡图中遇到的多个重复项的问题。现在我已经使用了 Contexts,我明白为什么将图表/视图拖到另一个显示器会强制重绘。我仍然想知道是否有办法阻止这种情况。我还认为,当我最终转向 Big Sur 和 UIKit 的 macos 实现时,我将能够以不同的方式工作。所以,我暂时把它打开。

标签: macos nsview xcode10 swift4.2 redraw


【解决方案1】:

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

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

如何阻止这种情况发生。

你不能,draw 被多次调用。

我想画图表,就是这样。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多