首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift: NSBezier

Swift: NSBezier
EN

Stack Overflow用户
提问于 2018-12-14 10:49:22
回答 1查看 137关注 0票数 0

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

代码语言:javascript
运行
复制
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方法中,我设置了自定义视图并尝试绘制测试点:

代码语言:javascript
运行
复制
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函数中调用这个函数?如何在上面的代码片段中看到我的观点?

EN

回答 1

Stack Overflow用户

发布于 2018-12-14 11:10:54

你不能随心所欲地画画。通常,您可以设置一个视图并按照您所做的那样实现draw(_:)。当需要视图来绘制其内容时,系统会调用draw方法。在调用draw(_:)方法之前,它会正确地设置绘制上下文,以便在视图内绘制,如果在视图外部绘制,则进行裁剪。这就是你所遗漏的部分。

一般来说,您不应该在视图的draw(_:)方法之外进行绘制。我在draw(_:)方法之外进行绘制的频率非常低,以至于我不记得您需要做什么才能正确地设置绘制上下文。(说句公道话,这些天我主要做iOS开发,我的MacOS已经生疏了。)

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

编辑:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53772866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档