Изменить ширину линии с помощью uislider в значении подкласса - PullRequest
0 голосов
/ 28 октября 2019

Мой код пытается использовать значение слайда, чтобы изменить ширину линии. Прямо сейчас это не работает. Я только хочу, чтобы линии, нарисованные до изменения значения, не выполнялись, только новые линии после изменения значения. Посмотрите на номер НДС в классе Canvas. Struct ColoredLine контролирует цвет линии.


    struct ColoredLine {
    var color = UIColor.black
    var points = [CGPoint]()
}


class ViewController: UIViewController {

    @objc func hhh() {
        canvas.number = Int(justinBiber.value)
    }

    var justinBiber = UISlider()
}

class Canvas: UIView {

       var strokeColor = UIColor.green
       var number = 5
        func undo() {
            _ = lines.popLast()
            setNeedsDisplay()
        }

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

        var lines = [ColoredLine]()

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

            guard let context = UIGraphicsGetCurrentContext() else { return }

            context.setLineWidth(number)
            context.setLineCap(.butt)

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

                context.setStrokeColor(line.color.cgColor)
                context.strokePath()
                context.beginPath()
            }


        }

        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            var coloredLine = ColoredLine()
            coloredLine.color = strokeColor
            lines.append(coloredLine)
        }

        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.points.append(point)
            lines.append(lastLine)
            setNeedsDisplay()
        }

    }

1 Ответ

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

Ширина линии - это еще одно свойство вашей линии. Добавьте это свойство к ColoredLine struct:

struct ColoredLine {
    var color = UIColor.black
    var width = 5
    var points = [CGPoint]()
}

Добавьте свойство strokeWidth к своему классу Canvas и обновите его при изменении значения ползунка:

class Canvas : UIView {
    var strokeWidth = 5

    ....
}

В touchesBegan() добавьте текущее значение strokeWidth к экземпляру coloredLine:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    var coloredLine = ColoredLine()
    coloredLine.color = strokeColor
    coloredLine.width = strokeWidth
    lines.append(coloredLine)
}

Затем в draw(rect:) установите context 'strokeWidth перед рисованием линии:

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

    context.setStrokeColor(line.color.cgColor)
    context.setLineWidth(line.width)
    context.strokePath()
    context.beginPath()
}
...