如何将标签设置为自定义进度条上的给定百分比

时间:2018-05-19 09:08:26

标签: ios swift uilabel core-animation

我已经创建了一些代码,我为自定义进度条设置了动画。下面是我到目前为止处理动画和标签的代码。 让animationProgress = CABasicAnimation(keyPath:" strokeEnd") 让值= 0.8 animationProgress.fromValue = 0 animationProgress.toValue = value(将显示80%的进度条) animationProgress.duration = 1 而值< = 1 {   DispatchQueue.main.async {  updateYourUI() } } animationProgress.isRemovedOnCompletion = false animationProgress.fillMode = kCAFillModeForwards shapeLayer.add(animationProgress,forKey:" animated") func updateYourUI(){  让值= 50  view.PercentageComplete.text =" \((value))%"  view.shapeLayer.strokeEnd = CGFloat(value) } 我怎样才能获得" let value"显示" fromValue"中的每个值和" toValue"因此,当运行进度条动画时,它们的标签将显示相应的值。我试图实现一个while循环howerver我不确定要放置什么条件,以便它运行来自" animationProgress.fromValue = 0"到" animationProgress.toValue"。

1 个答案:

答案 0 :(得分:1)

你可以检查图层的动画状态。 我使用了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的功能。 它保证你为整个Window中真正改变的每一帧获得一个函数调用。所以你可以肯定,你不会错过任何框架和每个框架更改的东西