Swift - обновляет UIButtton, когда CABasicAnimation завершена - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь сказать, где кнопка выбрана или нет, когда CAbasicanimation завершена.Анимация запускается на определенной кнопке при нажатии.

Когда кнопка нажата, я сохраняю значение тега кнопки в целое число «currentSelectedMarker».Это работает и дает желаемый результат, но если еще одна кнопка нажата до того, как анимация не закончена, она обновит эту нажатую кнопку вместо оригинальной кнопки, которая имеет анимацию.

Я знаю, что это потому, что значение«currentSelectedMarker» обновляется при нажатии любой кнопки, но что может быть способом обновить правильную кнопку после завершения анимации.Ниже приведен код, который я использую для анимации.

func AutoUpRadial(button: UIButton, height: Int, value: Int){

    let trackLayer = CAShapeLayer()

    let radius = height / 3
    let circularPath = UIBezierPath(arcCenter: button.center, radius: CGFloat(radius), startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true)
    trackLayer.path = circularPath.cgPath

    trackLayer.strokeColor = UIColor.black.cgColor
    trackLayer.opacity = 0.3
    trackLayer.fillColor = UIColor.clear.cgColor
    trackLayer.lineWidth = 5
    trackLayer.strokeEnd = 0

    mainScrollView.layer.addSublayer(trackLayer)

    autoUpFillRadial(value: value, tmpBtn: button, shape: trackLayer)
}

@objc private func autoUpFillRadial(value: Int, tmpBtn: UIButton, shape: CAShapeLayer){

    let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
    basicAnimation.toValue = 1
    basicAnimation.duration = CFTimeInterval(value)
    basicAnimation.fillMode = .forwards
    basicAnimation.isRemovedOnCompletion = true
    basicAnimation.delegate = self

    shape.add(basicAnimation, forKey: "basic")
}

func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {

    if let tmpButton = self.view.viewWithTag(currentSelectedMarker) as? UIButton {
        tmpButton.isSelected = false
    }
}

«CurrentSelectedMarker» - вот где проблема, насколько мне известно, но я даже не уверен, что это лучший способ решить проблему.Любая помощь приветствуется.

Спасибо

1 Ответ

0 голосов
/ 04 февраля 2019

Добавьте ваш Button tag к CABasicAnimation, используя метод setValue:forKey:, как показано ниже, и получите его от делегата.

@objc private func autoUpFillRadial(value: Int, tmpBtn: UIButton, shape: CAShapeLayer){

            let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
            basicAnimation.toValue = 1
            basicAnimation.duration = CFTimeInterval(value)
            basicAnimation.fillMode = .forwards
            basicAnimation.isRemovedOnCompletion = true
            basicAnimation.setValue(tmpBtn.tag, forKey: "animationID")
            basicAnimation.delegate = self

            shape.add(basicAnimation, forKey: "basic")
        }

        func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
            if let tag = anim.value(forKey: "animationID") as? Int {
                if let tmpButton = self.view.viewWithTag(tag) as? UIButton {
                    tmpButton.isSelected = false
                }
            }

        }
...