Радиус изменения для UibezierPath swift - PullRequest
0 голосов
/ 16 апреля 2020

Я нарисовал ар c и добавил к нему действие. Как я могу использовать это действие, чтобы изменить радиус ar c ?? (Пример: был радиус 30, нажал на ar c и +10. Снова нажал и -10). Я пытался изменить радиус, но результата не было. Пока это не двигается, и я не совсем понять, почему это так.

Вот полный код класса.

@IBDesignable class circleView: UIView {

    typealias ArcAction = () -> Void

    struct ArcInfo {
        var outlinePath: UIBezierPath
        var action: ArcAction
    }

    private var arcInfos: [ArcInfo]!

    let bgShapeLayer = CAShapeLayer()
     var redRadius: Float?


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

        let recognizer = UITapGestureRecognizer(target: self, action: #selector(tap(_ :)))
        addGestureRecognizer(recognizer)
    }

    override func draw(_ rect: CGRect) {

        let fullCircle = CGFloat.pi * 2
        let arcAngle = fullCircle * 1.5 / 6

        var lastArcAngle = CGFloat.pi / 4.0 + CGFloat.pi //-CGFloat.pi

        arcInfos = []


     // Red Arc
        func redArc( action: @escaping ArcAction) {

            let path = UIBezierPath(arcCenter: CGPoint(x: rect.width/2, y: rect.height/2), radius: CGFloat(redRadius ?? 46), startAngle: lastArcAngle, endAngle: lastArcAngle + arcAngle, clockwise: true)

            #colorLiteral(red: 0.7450980392, green: 0.007843137255, blue: 0.262745098, alpha: 1).setStroke()
            path.lineWidth = 10
            path.stroke()
            lastArcAngle += arcAngle

            // separators
            #colorLiteral(red: 0.927436769, green: 0.9490308166, blue: 0.967099607, alpha: 1).setStroke()
            let outlinePath = hitTestPath(for: path)
            outlinePath.lineWidth = 3
            outlinePath.stroke()

            arcInfos.append(ArcInfo(outlinePath: outlinePath, action: action))
        }

        //Add Arc
        redArc {
            self.redRadius = 56

        }

    }

    @objc func tap(_ recognizer: UITapGestureRecognizer) {
        let location = recognizer.location(in: self)

        if let hitPath = (arcInfos.first { $0.outlinePath.contains(location) }) {
            hitPath.action()
            print(hitPath)
        }
    }

    func hitTestPath(for path: UIBezierPath) -> UIBezierPath {
        let pathCopy = path.cgPath.copy(strokingWithWidth: 15, lineCap: .butt, lineJoin: .miter, miterLimit: 0)
        return UIBezierPath(cgPath: pathCopy)
    }
}

1 Ответ

0 голосов
/ 16 апреля 2020

Вам нужно запустить обновление пользовательского интерфейса ...

    if let hitPath = (arcInfos.first { $0.outlinePath.contains(location) }) {
        hitPath.action()

        // add this line
        setNeedsDisplay()

        print(hitPath)
    }

Примечание: ваш код, как есть, начинается с радиуса 46 ... при нажатии, с этой добавленной строкой он становится красным aws сам с радиусом 56.

...