Mark Tornej
Mark Tornej

Reputation: 175

What argument do I use when calling draw() function?

I want to draw a line programmatically in swift. I have working code for it (I think), but calling the function requires a CGRect argument. And I'm unsure what code to write there.

The draw() class and function looks like this:

class LineView : UIView {
    override func draw(_ rect: CGRect) {
        var aPath = UIBezierPath()

        aPath.move(to: CGPoint(x:2, y:2))

        aPath.addLine(to: CGPoint(x:6, y:6))

        aPath.close()
    }
}

Now calling it from the main ViewDidLoad it would look like this:

var line = LineView()
line.draw(MISSING ARGUMENT)

But I have no idea what argument I'm supposed to pass. Nothing of the CGRect is used in the function, so I'm not even sure of its purpose.

UPDATE In main I create the object like this:

class ViewController: UIViewController {

    @IBOutlet weak var gameBoard: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        var line = LineView()

        gameBoard.addSubview(line)

    }
}

And my draw class looks like this:

import UIKit

class LineView : UIView {

    override init(frame: CGRect) { 
    super.init(frame: frame) //super = DO REGULAR INIT STUFF FOR UIView

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

    }

    override func draw(_ rect: CGRect) {
        var aPath = UIBezierPath()

        aPath.move(to: CGPoint(x:2, y:2))

        aPath.addLine(to: CGPoint(x:6, y:6))

        aPath.close()

        UIColor.red.set()
        aPath.stroke()
        aPath.fill()

        setNeedsDisplay()
    }
}

Got it working with:

 override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Upvotes: 0

Views: 139

Answers (1)

vadian
vadian

Reputation: 285069

Don't call draw(rect: yourself. Never do.

It's implicitly called once by the framework after the view was initialized.

If you want to redraw the view call setNeedsDisplay() on the view.

Upvotes: 2

Related Questions