2017-01-22 4 views
1

私は風景の中で大きく見えるCAKeyframeAnimationを持っていますが、デバイスが回転すると、他のコンテンツと比較してアニメーションは当然です。進行中のアニメーションのパスを調整(スケール)する方法はありますか?CoreAnimationとデバイスローテーション

編集:コード

 let circle = CAShapeLayer() 
     circle.path = UIBezierPath(roundedRect: CGRect(x: -60.0, y: -60.0, width: 100.0, height: 100.0), cornerRadius: 50.0).cgPath 
     circle.fillColor = UIColor.clear.cgColor 
     circle.strokeColor = UIColor.blue.cgColor 

     let animation = CAKeyframeAnimation(keyPath: "position") 
     animation.duration = (path["endTime"] as! Double) - (path["startTime"] as! Double) 
     animation.repeatCount = 0 
     animation.path = (path as! UIBezierPath).cgPath 
     animation.calculationMode = kCAAnimationPaced 
     animation.fillMode = kCAFillModeForwards 
     animation.isRemovedOnCompletion = false 

     circle.add(animation, forKey: "position") 
     self.view.layer.insertSublayer(circle, at: 5) 

、問題はUIBezierPathを縦または横のいずれかで定義されていることである(APPの両方をサポートしている)ので、それが作成されたのと同じ向きで再生が問題ありませんを追加しますデバイスを回転させると、UIBezierPathで定義されたアニメーションを新しい方向に更新する必要があります。私はそれがアニメーション化している間に、新しい座標系へのCAKeyframeAnimationパスを更新する方法を探しています。

+0

私たちに見せるためのコードはありますか? – dfd

+0

あなたはアニメーションを変更したいと言っていますが、アニメーションの途中です_ユーザーがデバイスを回転させたためですか? – matt

+0

正確に!座標系が変更されるため、パスを更新する必要があります。私はそれをどうやって行うのか分かりません。 – Chris

答えて

0

その場でパスを調整することはできませんが、元のポイントと計算された縮尺/翻訳に基づいて新しいパスを作成することができます。あなたがこの方法を使用することができますUIBezierPathからCGPointsの配列を取得するには

:パスを再計算し、アニメーションが始まると、デバイスの回転のためにhttps://stackoverflow.com/a/36374209/1491675

をアニメーションにし、デバイスの回転に現在のポイントへの参照を保持し、既存のアニメーションを、すでに発生しているアニメーションの部分を残して置き換える新しいアニメーションに置き換えます。

+0

私は、回転が開始されたときにアニメーションが停止しただけでなく、表示されている場所(プレゼンテーションレイヤーからこの情報が得られる)にビューを残してから、新しいアニメーションで新しいアニメーションを開始する理由を理解できません。回転後のパスが終了します。 – matt

+0

私は上記のような意味ですか? "...デバイス回転時にパスを再計算し、既存のアニメーションを新しいアニメーションに置き換えます..." – Chris

+0

実際のコードを見せてくれれば、他の人にも役立つかもしれません。 – matt