2016-10-24 3 views
1

У меня есть круг, который оживляет себя. Ему дается число от 0,01 до 1,0, и после этого он оживляется по кругу.Обновление процентной доли uilabel с анимацией цикла прогресса swift

У меня есть ярлык посреди него, который называется 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 
       } 

ответ

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 от где вы хотите, чтобы отобразить текущее значение

+0

Кодекса перерывы в этой части: 'ток = currentLayer .valueForKey («strokeEnd»), как?! Float' –

+0

Какая ошибка вы получаете –

Смежные вопросы