这是我的自定义视图类中的代码:
func drawTestingPoint(_ point: CGPoint, target: Int, output: Int) {
let path = NSBezierPath()
path.appendArc(withCenter: point, radius: 5, startAngle: 0, endAngle: 360)
NSColor.black.setStroke()
if target == output {
NSColor.green.setFill()
} else {
NSColor.red.setFill()
}
path.lineWidth = 3
path.fill()
path.stroke()
}
override func draw(_ dirtyRect: NSRect) {
//If I call the drawTestingPoint function here it works
}
在NSViewController
类的viewDidLoad
方法中,我设置了自定义视图,并尝试绘制测试点:
let size = getDataViewSize()
let origin = CGPoint(x: view.frame.width/2-size.width/2, y: view.frame.height/2-size.height/2)
dataView = DataView(frame: CGRect(origin: origin, size: size))
view.addSubview(dataView)
dataView.drawTestingPoint(CGPoint(x: view.frame.width/2 y: view.frame.height/2), target: target, output: output)
dataView.needsDisplay = true
我的问题是没有一点被画出来。我认为我的drawTestingPoint
函数不会有任何问题,因为当我在自定义NSView
类的draw(_ dirtyRect: NSRect)
函数中调用它时,它就可以工作了。我能做些什么,这样我就可以在我的viewDidLoad
函数中调用这个函数,你可以在上面的代码片段中看到什么,这样就可以得出我的观点
你不能随心所欲地画画。通常情况下,您会设置一个视图,并像您所做的那样实现draw(_:)
。系统在需要视图绘制其内容时调用draw方法。在调用draw(_:)
方法之前,它会正确设置图形上下文,以便在视图内部绘制,如果在视图外部绘制则会进行剪裁。这就是你所缺少的。
一般来说,您不应该在视图的draw(_:)
方法之外进行绘制。我很少在draw(_:)
方法之外进行绘图,所以我不记得要正确设置绘图上下文需要做什么。(公平地说,这些天我主要做iOS开发,我的MacOS越来越生疏了。(
因此,简短的回答是";不要那样做">
编辑:
相反,可以设置自定义视图来保存自己绘制所需的信息。正如其他人所建议的,当您对视图进行更改时,请在视图上设置needsDisplay=true
。这将导致系统在下一次通过事件循环时调用视图的draw(_:)
方法