2017-08-02 161 views
0

我试图同时在动画上,从哪里变CABasicAnimation的toValue/fromValue的值,其中动画是heartBeatAnimation如何更改CABasicAnimation的toValue/fromValue而动画是

let heartBeatAnimation = CABasicAnimation(keyPath: "transform.scale.xy") 
heartBeatAnimation.duration  = 0.75 
heartBeatAnimation.repeatCount = Float.infinity 
heartBeatAnimation.autoreverses = true 
heartBeatAnimation.fromValue  = 1.0 
heartBeatAnimation.toValue  = 1.15 

我在动画过程中得到了transform.scale的当前值与此:

let currentValue = someView.layer.presentation()?.value(forKeyPath: "transform.scale") 
heartBeatAnimation.fromValue = currentValue 
heartBeatAnimation.toValue = currentValue 

后,我改变了值,则heartBeatAnimation不会改变其toValue/fromValue,直到我删除动画然后重新添加一次!

有什么办法可以在动画上实时进行这些更改?!

+0

你知道规模将停止动画? –

+0

我改变了值'heartBeatAnimation'不会改变'toValue/fromValue'直到我移除动画,然后再次添加! –

+0

并且在打破thr动画之后直接添加动画? –

回答

1

您可以通过将模型图层当前比例更新为表示图层比例,然后通过更新beginTime属性来读取动画,以便动画看起来永不停止,从而实时显示它。这是一个例子。

import UIKit 

class ViewController: UIViewController { 


    var scale : CGFloat = 1.2 

    var shapeLayer : CAShapeLayer! 
    var button : UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //add a shapelayer 
     shapeLayer = CAShapeLayer() 
     shapeLayer.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width/4, height: self.view.bounds.width/4) 
     shapeLayer.position = self.view.center 
     shapeLayer.path = drawStarPath(frame: shapeLayer.bounds).cgPath 
     let color = UIColor(red: 0.989, green: 1.000, blue: 0.000, alpha: 1.000) 
     shapeLayer.fillColor = color.cgColor 
     self.view.layer.addSublayer(shapeLayer) 


     //button for action 
     button = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width - 20, height: 50)) 
     button.center = self.view.center 
     button.center.y = self.view.bounds.height - 70 
     button.addTarget(self, action: #selector(ViewController.pressed(sender:)), for: .touchUpInside) 
     button.setTitle("Animate", for: .normal) 
     button.setTitleColor(.blue, for: .normal) 

     self.view.addSubview(button) 

    } 

@objc func pressed(sender:UIButton) { 

    var isInterupted = false 

     if let presentation = shapeLayer.presentation(){ 
      if let animScale = presentation.value(forKeyPath: "transform.scale.xy"){ 
       if let value = animScale as? CGFloat{ 
        //set current animation spot 
        shapeLayer.transform = CATransform3DScale(CATransform3DIdentity, value, value, 1) 
        shapeLayer.removeAllAnimations() 
        scale += 0.2 
        isInterupted = true 
        print("The current toValue is \(scale)") 

       } 
      } 
     } 


     button.setTitle("Animating...", for: .normal) 

     let heartBeatAnimation = CABasicAnimation(keyPath: "transform.scale.xy") 
     heartBeatAnimation.duration  = 0.5 
     let beginTimeNeeded = (1/scale) * CGFloat(heartBeatAnimation.duration) 
     heartBeatAnimation.repeatCount = .greatestFiniteMagnitude 
     heartBeatAnimation.autoreverses = true 
     heartBeatAnimation.fromValue  = 1.0 
     heartBeatAnimation.toValue  = scale 
     if isInterupted == true{ 
      heartBeatAnimation.beginTime = CFTimeInterval(beginTimeNeeded) 
     } 
     heartBeatAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
     shapeLayer.add(heartBeatAnimation, forKey: "beatAnimation") 
    } 

    func drawStarPath(frame: CGRect = CGRect(x: 0, y: 0, width: 140, height: 140)) ->UIBezierPath{ 
     //// Star Drawing 
     let starPath = UIBezierPath() 
     starPath.move(to: CGPoint(x: frame.minX + 0.50000 * frame.width, y: frame.minY + 0.21071 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.60202 * frame.width, y: frame.minY + 0.35958 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.77513 * frame.width, y: frame.minY + 0.41061 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.66508 * frame.width, y: frame.minY + 0.55364 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.67004 * frame.width, y: frame.minY + 0.73404 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.50000 * frame.width, y: frame.minY + 0.67357 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.32996 * frame.width, y: frame.minY + 0.73404 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.33492 * frame.width, y: frame.minY + 0.55364 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.22487 * frame.width, y: frame.minY + 0.41061 * frame.height)) 
     starPath.addLine(to: CGPoint(x: frame.minX + 0.39798 * frame.width, y: frame.minY + 0.35958 * frame.height)) 
     return starPath 
    } 

} 

我按下按钮,以更大规模添加到动画。 这里是结果: Result