2016-07-19 1 views
1

CAShapeLayerパスをCASpringAnimationでアニメーション化することを試しています。予想される結果は、「弾力のある」動作をする形状間の「モーフィング」です。CAShapeLayerパスのスプリングアニメーションが「オーバーシュート」しない

私は以下のように円と方形のパスの間に基本的なコード例を持っていますが、最終的な結果は期待される動作である最終的なより大きな方形のパスを過ぎて「オーバーシュート」しないスプリングアニメーションです。

enter image description here

私のコードは次のとおりです。

let springAnimation = CASpringAnimation(keyPath: "path") 
springAnimation.damping = 1 
springAnimation.duration = springAnimation.settlingDuration 
springAnimation.fromValue = standardCirclePath().cgPath 
springAnimation.toValue = standardSquarePath().cgPath 

circleLayer.add(springAnimation, forKey: nil) // Where circleLayer (red background) is a sublayer of a basic UIView in the frame (blue background) 

私はfrom this answer私のパスを得ました。

CAShapeLayerパス変換でこれを達成するためのCASpringAnimationの方法はありますか?そうでなければ、代替案は何ですか?

+0

私が知る限り、パスのアニメーションのオーバーシュートやアンダーシュートには、 'CASpringAnimation'を使うことはできません。これは重要な問題ではなく、Core Animationは自動パス補間のための洗練されたサポートを持っていないようです。これを解決するには、アニメーションのオーバーシュートとアンダーシュートの停止のためにいくつかのパスキーフレームを追加する必要があります。 – LucasTizma

答えて

-1

こんにちは、私はあなたの質問に取り組んでいた、これは私の結果である、GIF上のグリッチが私のGIFコンバータが非常に悪いコンバータ

​​

あるので、これはコード

class ViewController: UIViewController { 

    @IBOutlet weak var animatableVIew: UIView! 
    var isBall = false 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 
    @IBAction func startAnimation(sender: AnyObject) { 

     isBall = !isBall 

     let springAnimation = CASpringAnimation(keyPath: "cornerRadius") 
     let halfWidth = animatableVIew.frame.width/2 
     let cornerRadius: CGFloat = isBall ? halfWidth : 0 
     springAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
     springAnimation.fromValue = isBall ? 0 : halfWidth ; 
     springAnimation.toValue = cornerRadius; 
     springAnimation.damping = 7 
     springAnimation.duration = springAnimation.settlingDuration 
     animatableVIew.layer.cornerRadius = cornerRadius 

     let springAnimation2 = CAKeyframeAnimation(keyPath: "transform.scale") 
     springAnimation2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
     springAnimation2.values = [1,0.9,1.4,0.8,1] 
     springAnimation2.keyTimes = [ 0, (1/6.0), (3/6.0), (5/6.0), 1 ]; 
     springAnimation2.duration = springAnimation.settlingDuration * 0.5 

     let groupSpringAnimation = CAAnimationGroup() 
     groupSpringAnimation.animations = [springAnimation,springAnimation2] 
     groupSpringAnimation.duration = springAnimation.settlingDuration 
     groupSpringAnimation.beginTime = 0; 
     animatableVIew.layer.addAnimation(groupSpringAnimation, forKey: "group") 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 
です

私はこれが助けてくれることを願っています

+0

OPは、keyPath "path"に対して、特に "CASpringAnimation"について質問しました。あなたの答えには「パス」という言葉も含まれていません。 – chicobermuda

+0

@chicobermudaこれに答える必要がありましたか? –

+0

ええ、まだ1のための徘徊で。 – chicobermuda

関連する問題