2017-11-28 9 views
2

CALayerの特定のプロパティをアニメートするときに、keyPathが文字列である理由が混乱しています。列挙型を使用するだけでは安全ではないでしょうか?文字列リテラルを打ち込むことの利点については不思議です。なぜコアアニメーションタイプが文字列キーパスを取るのですか?

例:あなたはスウィフトコード可能なとCodingKeysのようにリフレクションを使用して考えている場合let flash = CASpringAnimation(keyPath: "borderColor")

答えて

4

Core Animationを客観CとObjective Cで書かれていたが、迅速な列挙型を持っていません。

コアアニメーションでは、KVOを使用して、レイヤのプロパティの変更を検出してアニメートします。これは暗黙的なアニメーションを可能にするもので、UIView.Animationメソッドは、ブロック内で何かを明示的にアニメーション化せずに変更を加えたときにアニメーション化することができます。プロパティの値を変更すると、アニメーションシステムはKVOによる変更を観察し、対応するアニメーションを生成します。

+0

グレート簡潔な答えが。ありがとうございます –

+0

偉大な答えです。あなたはコアアニメーションのいくつかの良いリソースを提案できますか? – TheoK

5

Josh Homannの答えは非常に役に立ちますが、この場合には特別な列挙型がないことにも注意してください。 CASpringAnimationは、組み込みのプロパティだけでなく、どのプロパティにも適用できます。たとえ組み込みのCALayerサブクラスがたくさんあり、それ自体が異なるプロパティを持っているので、「組み込み」でさえ誤解を招きます。アニメーションはレイヤーに適用する必要はありません(SceneKitもレイヤーを使用します)。レイヤーにカスタムプロパティを追加し、それを春のアニメーションでアニメートする場合は、これが列挙型であれば不可能です。

つまり、ここで文字列(または文字列定数)を渡すよりもうまくいくと言えます。あなたは#keyPathを使用することができます。

let flash = CASpringAnimation(keyPath: #keyPath(CALayer.borderColor)) 

これは、コンパイル時にこのメソッドが実際に定義されていることを確認しています。これは、enumを使用して探しているときに目標の多くを達成し、ターゲットやプロパティを処理するのに十分な柔軟性を備えています。

将来的には、うまくいけば、Core Animationが新しいスウィフト4「キーパス」タイプを受け入れます、そしてあなたはこれを行うことができるようになります:明確にそれを説明し

let flash = CASpringAnimation(keyPath: \CALayer.borderColor) 
+0

詳細な説明をいただきありがとうございます。非組み込み型の例は何でしょうか?アニメーション化できるビューには有限数のプロパティはありませんか? –

+1

非組み込みでは、私は単に "カスタムCALayerサブクラス"を意味します。私はこれらのすべての時間を行います。アニメーション化できるレイヤーには無限の数のプロパティーがあります(もちろん、単純なプロパティーではなくキー*パスにすることもできます)。例については、https://github.com/rnapier/richtext-coretext/blob/master/PinchText/Classes/PinchTextLayer.mを参照してください。その層には「touchPointForIdentifier」という辞書があります。私はkeyPath 'touchPointForIdentifierをアニメートします。 .scale'(NSDictionaryはすべてのキーをキーパスとして公開します)。ここでの「スケール」は単純なNSObjectサブクラス(レイヤではない)のプロパティです。 –

+1

もっと簡単な例は、https://github.com/iosptl/ios7ptl/blob/master/ch08-Animation/Actions/Actions/CircleLayer.mを参照してください。これは 'radius'プロパティをアニメーション化するサークルレイヤーです。 (これは暗黙的にradiusプロパティをアニメーション化するので、 'circle.radius = 4'を呼び出すとアニメーション化されますが、keyPathの" radius "にはCABasicAnimationが実装されています)。 –

関連する問題