ios - 用进度圈动画更新 uilabel 百分比 swift

标签 ios swift animation uilabel

我有一个动画自己的圆圈。它被赋予一个介于 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
                }

最佳答案

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

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

关于ios - 用进度圈动画更新 uilabel 百分比 swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40220281/

相关文章:

ios - 奇怪的 "Retina"iOS 模拟器行为

ios - 是否可以快速将录音机音频文件保存在音乐中?

ios - 评论主 Storyboard上的 View

swift - 如何检查 UITableViewCell 中的 UILabel 是否被截断?

android - 交易期间的 fragment 动画 - 仅左滑有效,右滑无效

ios - 调用错误之谜中的额外参数

ios - 查询晚于 24 小时的对象

wpf - 在 WPF 动画中,将属性 BeginTime 设置为静态资源

javascript - 如何在单击某个按钮时激事件画?

javascript - 为什么 android 的代码在 IOS 中不起作用?