изменить цвет линии CGPoint в подклассе uiview - PullRequest
0 голосов
/ 27 октября 2019

Мой код пытается изменить цвет линии с красного на синий, когда вызывается головокружение в классе View Controller. Проблема в том, что я не знаю, как это сделать из контроллера представления классов. Я могу сделать это в классе Canvas, но мне нужно управлять им из func dizzy, потому что он служит кнопкой в ​​классе viewController. Мне все равно, нужно ли мне создавать func в функции canvas и затем вызывать ее из viewController.

class ViewController: UIViewController {
    var canvas = Canvas()
@objc func dizzy() {

}}



    class Canvas: UIView {

// public function
func undo() {
    _ = lines.popLast()
    setNeedsDisplay()
}

func clear() {
    lines.removeAll()
    setNeedsDisplay()
}




var lines = [[CGPoint]]()

override func draw(_ rect: CGRect) {
    super.draw(rect)

    guard let context = UIGraphicsGetCurrentContext() else { return }

    context.setStrokeColor(UIColor.red.cgColor)
    context.setLineWidth(5)
    context.setLineCap(.butt)

    lines.forEach { (line) in
        for (i, p) in line.enumerated() {
            if i == 0 {
                context.move(to: p)
            } else {
                context.addLine(to: p)
            }
        }
    }

    context.strokePath()

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    lines.append([CGPoint]())
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let point = touches.first?.location(in: self) else { return }
    guard var lastLine = lines.popLast() else { return }
    lastLine.append(point)
    lines.append(lastLine)
    setNeedsDisplay()
}

}

1 Ответ

0 голосов
/ 27 октября 2019

Добавьте свойство с именем strokeColor к вашему Canvas:

class Canvas : UIView {
    var strokeColor = UIColor.red {
        didSet {
            self.setNeedsDisplay()
        }
    }

    ... 
}

Используйте strokeColor в draw(rect:):

context.setStrokeColor(strokeColor.cgColor)

Затем в dizzy() установитеcanvas 'strokeColor to .blue:

class ViewController: UIViewController {
    var canvas = Canvas()

    @objc func dizzy() {
        canvas.strokeColor = .blue
    }
}

Каждый раз, когда вы устанавливаете strokeColor для Canvas, он вызовет перерисовку, вызвав self.setNeedsDisplay() в своем наблюдателе свойства didSet,Новый вызов draw(rect:) будет использовать новый цвет для перерисовки вида.

...