【问题标题】:Update uilabel percentage with animation of progress circle swift用进度圈动画快速更新uilabel百分比
【发布时间】:2016-10-24 13:54:06
【问题描述】:

我有一个自己在动画的圆圈。它被赋予一个介于 0.01 和 1.0 之间的数字,然后它会以圆圈的形式显示动画。

我在它的中间有一个名为progressLabel 的标签。我希望标签随着圆圈的动画而计数。因此,如果该值为 0.12,则标签应显示 12%。

这是我的圈子动画的代码:

func animateView(toValue: Double, strokeColor: UIColor) {

        let screenWidth = self.view.frame.size.width
        let screenHeight = self.view.frame.size.height

        let circle = UIView(frame: CGRectMake((screenWidth / 2) - (150 / 2), (screenHeight / 2) - (150 / 2), 150, 150)) // viewProgress is a UIView
        circle.backgroundColor = UIColor.clearColor()
        view.addSubview(circle)

        var progressCircle = CAShapeLayer()
        var backgroundCircle = CAShapeLayer()
        progressCircle.frame = view.bounds
        backgroundCircle.frame = view.bounds

        let lineWidth:CGFloat = 20
        let rectFofOval = CGRectMake(lineWidth / 2, lineWidth / 2, circle.bounds.width - lineWidth, circle.bounds.height - lineWidth)

        let circlePath = UIBezierPath(ovalInRect: rectFofOval)

        progressCircle = CAShapeLayer ()
        progressCircle.path = circlePath.CGPath
        progressCircle.strokeColor = UIColor.whiteColor().CGColor
        progressCircle.fillColor = UIColor.clearColor().CGColor
        progressCircle.lineWidth = 20.0
        progressCircle.frame = view.bounds
        progressCircle.lineCap = "round"

        backgroundCircle = CAShapeLayer ()
        backgroundCircle.path = circlePath.CGPath
        backgroundCircle.strokeColor = strokeColor.CGColor
        backgroundCircle.fillColor = UIColor.clearColor().CGColor
        backgroundCircle.lineWidth = 20.0
        backgroundCircle.frame = view.bounds
        backgroundCircle.lineCap = "round"

        circle.layer.addSublayer(backgroundCircle)
        circle.layer.addSublayer(progressCircle)
        circle.transform = CGAffineTransformRotate(circle.transform, CGFloat(-M_PI_2))

        let animation = CABasicAnimation(keyPath: "strokeEnd")
        animation.fromValue = 0
        animation.toValue = toValue
        animation.duration = 1
        animation.fillMode = kCAFillModeForwards
        animation.removedOnCompletion = false
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)

        progressCircle.addAnimation(animation, forKey: nil)
    }

我试过了,但标签一直显示 0.0%..

var current: Double = 0.0

                let i = current * 100
                let max = 0.1 * 100


                if i < max {


                    self.progressLabel.text = "\(current)%"
                    current += 0.01 * 100
                }

【问题讨论】:

    标签: ios swift animation uilabel


    【解决方案1】:

    您应该检查表示层的值以获取动画属性的当前值。

    func printValue() {
            let currentLayer = progressCircle.presentation()
            current = currentLayer?.value(forKeyPath: "strokeEnd") as? Float;
            print("current \(current)")
    
            let i = current! * 100
            let max:Float = 100
    
    
            if i < max {
                self.progressLabel.text = "\(current! * 100)%"
            }
    
        }
    

    从你想显示当前值的地方调用 printValue 方法

    【讨论】:

    • 这部分代码中断:current = currentLayer?.valueForKey("strokeEnd") as! Float
    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多