【发布时间】: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