2016-09-29 11 views
1

このコードをSwift 3.0に書きましたが、drawDorderからneedDisplay = trueで描画メソッドが呼び出されませんでした。 drawBorderは別のビューのボタンをクリックすることで呼び出されます。 ありがとうございます。func draw(_ dirtyRect:NSRect)が呼び出されていません

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 
} 

}

答えて

1

最後に、私は通知を経由して、それを解決し

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 
} 
} 

通知drawBorder方法でsetNeedsDisplay()を呼び出してみてください代わりにneedsDisplayプロパティのこの

@IBAction func btnDraw(_ sender: NSButton) { 
    NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: "drawBorder"), object: sender) 
} 
1

これはdraw(_:)メソッドを呼び出す必要があり、あなたのビューにsetNeedsDisplay(_:)メソッドを呼び出すようにしてください。自分でdraw(_:)メソッドに決して電話しないでください。

+0

のようなのViewControllerからpostecです。 –

+0

私はdraw(_ :)を呼び出さないneedDisplay = trueを設定するとdraw(_ :)を呼び出す必要があります。カスタムビューの外側をクリックしてdrawBorderを呼び出すので、私はそれが疑わしいです。 ** override func mouseUp(イベント:NSEvent)から呼び出すと{ drawBorder() } **それは完全に機能します。 – Dawy

+0

私はsetNeedsDisplay(self.bounds)を追加して変更を加えませんでした。 setNeedsDisplay(InvalidRect:NSRect)にはSwift 3の引数が必要です。 – Dawy

関連する問題