未调用func draw(udirtylect:NSRect)
我在Swift 3.0中编写了这段代码,但needsDisplay=true没有从func drawBorder调用draw方法;通过单击另一个视图中的按钮来调用drawBorder。 谢谢你的提示未调用func draw(udirtylect:NSRect),draw,swift3,nsview,Draw,Swift3,Nsview,我在Swift 3.0中编写了这段代码,但needsDisplay=true没有从func drawBorder调用draw方法;通过单击另一个视图中的按钮来调用drawBorder。 谢谢你的提示 class clsDrawView: NSView { private var redraw = false var border = NSBezierPath() var color = NSColor() override func draw(_ dirtyR
class clsDrawView: NSView {
private var redraw = false
var border = NSBezierPath()
var color = NSColor()
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
if redraw {
color.setStroke()
border.stroke()
}
}
func drawBorder() {
redraw = true
color = NSColor.blue
border.lineWidth = CGFloat(10)
border.move(to: NSPoint(x: 20, y: 20))
border.line(to: NSPoint(x: 50, y: 50))
needsDisplay = true
}
}
尝试在视图上调用
setNeedsDisplay(:)
方法,这应该调用draw(:)
方法。不要自己调用draw(:)
方法。最后我通过通知解决了这个问题
class clsDrawView: NSView {
private var draw = false
private var border = NSBezierPath()
var color = NSColor()
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
NotificationCenter.default.addObserver(self, selector: #selector(self.drawBorder(_:)), name: NSNotification.Name(rawValue: "drawBorder"), object: nil)
// Drawing code here.
if draw {
color.setStroke()
border.stroke()
}
}
func drawBorder(_ notification: NSNotification) {
draw = true
color = NSColor.black
NSBezierPath.setDefaultLineWidth(4)
border.lineWidth = CGFloat(10)
border = NSBezierPath(rect: self.bounds)
needsDisplay = true
}
}
通知是从ViewController发出的,如下所示
@IBAction func btnDraw(_ sender: NSButton) {
NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: "drawBorder"), object: sender)
}
尝试调用drawBorder方法中的setNeedsDisplay(),而不是needsDisplay属性。我没有调用draw(:),我只是将needsDisplay设置为true,这将确保调用draw(:)。我怀疑这是因为我在自定义视图之外通过单击按钮调用drawBorder。如果我从override func mouseUp(使用event:NSEvent){drawBorder()}调用它,那么它工作得非常好。请注意,setNeedsDisplay(InvalidRect:NSRect)需要Swift 3Ok中的参数。我在操场上测试过。尝试从draw方法中删除“如果”条件。那么,它会在启动应用程序时崩溃。