斯威夫特:NSBezier

时间:2018-12-14 02:49:22

标签: swift macos drawing nsview nsbezierpath

这是我的自定义视图类中的代码:

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
}

在我的viewDidLoad类的NSViewController方法中,我设置了自定义视图并尝试绘制测试点:

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函数没有任何问题,因为当我在自定义draw(_ dirtyRect: NSRect)类的NSView函数内部调用它时,它可以工作。我该怎么办,我可以在viewDidLoad函数中调用此函数,您如何在上面的代码段中看到这些代码,这样我的观点就被理解了

1 个答案:

答案 0 :(得分:1)

您不能随便画画。通常,您已经完成了设置视图并实现draw(_:)。当需要视图绘制其内容时,系统将调用draw方法。在调用draw(_:)方法之前,它会正确设置绘图上下文以在视图内部进行绘制,如果在视图外部进行绘制则进行裁剪。那就是你所缺少的。

一般而言,您不应在视图的draw(_:)方法之外进行绘制。我很少在draw(_:)方法之外进行绘制,所以我不记得要正确设置绘制上下文所需要执行的操作。 (为公平起见,这些天我主要从事iOS开发,而MacOS越来越生锈。)

所以简短的答案是“不要那样做。”

编辑:

相反,请设置您的自定义视图以保存其自身绘制所需的信息。正如其他人所建议的那样,当您对视图进行更改时,请在视图上设置needsDisplay=true。这将导致系统在下一次通过事件循环时调用视图的draw(_:)方法