Как установить метку для подсчета до указанного процента на пользовательском индикаторе прогресса - PullRequest
0 голосов
/ 19 мая 2018

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

let animationProgress= CABasicAnimation(keyPath: "strokeEnd")
let value = 0.8
animationProgress.fromValue = 0
animationProgress.toValue = value   (will display 80% of the progressbar)
animationProgress.duration = 1

while value <= 1 {
  DispatchQueue.main.async {
 updateYourUI()
}

}


animationProgress.isRemovedOnCompletion = false 
animationProgress.fillMode = kCAFillModeForwards
shapeLayer.add(animationProgress, forKey: "animated")



func updateYourUI (){
 let value= 50
 view.PercentageComplete.text = "\((value))%"
 view.shapeLayer.strokeEnd = CGFloat(value)

}

Как я могу получить«let value» отображает каждое значение из «fromValue» и «toValue», так что их метка будет отображать соответствующее значение при запуске анимации индикатора выполнения.Я пытался реализовать цикл while, но я не уверен, какое условие разместить, чтобы оно выполнялось для каждого значения от «animationProgress.fromValue = 0» до «animationProgress.toValue».

1 Ответ

0 голосов
/ 19 мая 2018

вы можете проверить состояние анимации слоя.Я использовал подход DisplayLink

@IBOutlet weak var percentageLabel: UILabel!    
let loadingDisplayLink: CADisplayLink?
let shapeLayer: CAShapeLayer?

// in your viewDidAppear for example
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let displaylink = CADisplayLink(target: self, selector: #selector(updateLabel))
    displaylink.add(to: .current,
                    forMode: .defaultRunLoopMode)
    loadingDisplayLink = displayLink
}

func updateLabel(displayLink: CADisplayLink) {
    if let layer = shapeLayer {
        let percent: CGFloat = layer.presentation()?.value(forKeyPath: "strokeEnd") as? CGFloat ?? 0.0
        percentageLabel.text = String(format: "%.f%%", percent * 100)

        if percent >= 1 {
            displayLink.invalidate()
            loadingDisplayLink = nil
        }
    }
}

, чтобы объяснить, что делает CADisplayLink.Это гарантирует, что вы получите вызов функции для каждого кадра, который действительно изменяется в полном окне.Так что вы можете быть уверены, что вы не пропустите ни одного кадра и не делаете что-то на каждой смене кадров

...