【问题标题】:OSX Swift , Draw a simple line with a push of a buttonOSX Swift,按一下按钮画一条简单的线
【发布时间】:2017-09-21 18:07:17
【问题描述】:

为此寻找了很多,但没有找到匹配的。 真的很简单我想画一条线买一个按钮。 我有一个来自 NSView 的类来进行绘图,它监视一个 var,如果它改变以重绘视图。 我可以通过更改值来单击鼠标来调用视图,并且绘制得很好。但我无法让按钮工作。它调用绘图方法但视图没有更新??? 我知道它一定很简单,但我就是找不到它。 提前致谢。

下面是我的视图类和视图控制器。

    //
//  LineDrawer.swift
//  TestDraw3
//
//  Created by Colin Wood on 21/04/17.
//  Copyright © 2017 Colin Wood. All rights reserved.
//

import Cocoa



class LineDrawer : NSView {
// Vars
    var newLinear = NSBezierPath()


    public var QQ: Int = 0 {   // every time QQ changes redraw information in QQ
        didSet{
            boom()    // drawing method
        }
    }



// Methods
    override func draw(_ dirtyRect: NSRect) {
        NSColor.red.set()
        newLinear.lineWidth = 5
        newLinear.lineCapStyle = NSLineCapStyle.roundLineCapStyle
        newLinear.stroke()
    }

    func boom(){  // draw a simple line
        Swift.print("In BooM")
        Swift.print(QQ)
        let lastPt = NSPoint(x: QQ, y: 1)
        newLinear.move(to: lastPt)
        let newPt = NSPoint(x: QQ, y: 50)
        newLinear.line(to: newPt)
        needsDisplay = true
    }

     override func mouseDown(with theEvent: NSEvent) {
        QQ = QQ + 7  // just add 7 so you can see it being drawn after didSet 
    }

}


//
//  ViewController.swift
//  TestDraw3
//
//  Created by Colin Wood on 15/04/17.
//  Copyright © 2017 Colin Wood. All rights reserved.
//

import Cocoa

class ViewController: NSViewController {
// Vars
    @IBOutlet weak var textField: NSTextField!

// Methods
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.

        }
    }


    @IBAction func button(_ sender: Any) {
        let v = LineDrawer()
        v.QQ = 300  // change QQ to call didSet
    }

}

【问题讨论】:

    标签: macos swift3 drawing nsview drawing2d


    【解决方案1】:

    您需要将LineDrawer 添加为子视图。添加它的好地方是viewDidLoad 方法:

    private var line: LinerDrawer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        line = LinerDrawer()
        line.frame = NSMakeRect(0, 0, 200, 200)
        line.QQ = 300
        line.isHidden = true
        view.addSubview(line)
    }
    

    然后当你点击按钮时最终显示它:

    @IBAction func button(_ sender: Any) {
        line.isHidden = false
    }
    

    您仍然需要为您的LineDrawer 视图计算出正确的frame

    【讨论】:

    • 谢谢保罗,它让我走上了正轨。我没有告诉你我有一个自定义视图,所以使用它的大小等等。
    • @HelpWoody 好的,太好了 :) 祝你的应用好运!
    猜你喜欢
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多