2017-08-02 163 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