swift - 斯威夫特:NSBezier
问题描述
这是我的自定义视图类中的代码:
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
你如何在上面的代码片段中看到这样我的观点
解决方案
你不能随便画。通常你设置一个视图并draw(_:)
像你一样实现。系统在需要视图绘制其内容时调用 draw 方法。在调用您的draw(_:)
方法之前,它会正确设置绘图上下文以在您的视图内绘制,如果您在视图外绘制,则进行剪辑。这就是你所缺少的。
作为一般规则,您不应该在视图的draw(_:)
方法之外进行绘制。我draw(_:)
很少在方法之外完成绘图,以至于我不记得您需要做什么才能正确设置绘图上下文。(公平地说,这些天我主要做 iOS 开发,而我的 MacOS 正在生锈。)
所以简短的回答是“不要那样做”。
编辑:
相反,设置您的自定义视图以保存它自己绘制所需的信息。正如其他人所建议的那样,当您对视图进行更改时,请在视图上进行设置needsDisplay=true
。这将导致系统draw(_:)
在下一次通过事件循环时调用视图的方法
推荐阅读
- r - 如何在拆分df列表时保留空df的变量
- reactjs - ReactJS 在功能组件中设置状态的基本问题
- c# - 如何使用 azure service bus 5.0.0 在 C# azure 函数中手动处理消息完成
- owl-carousel-2 - 猫头鹰轮播响应式导航箭头大小变化
- nuget-package - 如何制作 UI NuGet 包?
- c# - 为输入数组的每个元素设置一个请求正文
- sorting - 在 OUbuild 中将数据从一个列表移动到另一个列表并对其进行排序
- api - 如何在至少有一定生命周期的 Nifi 中恢复流文件?
- python - AllValuesFilter 显示来自用户以外的数据,即使提供了查询集(Django-filters)
- powerbi - 合同仪表板的 DAX 公式