2009-05-16 10 views
2

コアアニメーションの学習では、正しく実行しなければ、未知の未定義の動作が発生することを非常に素早く学びました。その目的のために、私はそれを概念的に理解するのに役立ついくつかの質問があります。コアアニメーションのコード構造/コンベンション

  • NSViewのサブクラスでは、initが次のように宣言されています。このビューは、通常のレイヤーバックアップビューのサブビューです。

    これ以降、[自分のレイヤー]ではなく、自分自身をどのような状況で参照する必要がありますか?明示的で暗黙的なアニメーションでレイヤーを操作し、[self setFrame:]などから離れ、[[self layer] setPosition]などを使用しています。

  • このアプローチの問題は、ビューは、適用されたすべてのアニメーションを通して1つの場所にとどまります。私の見解がマウスイベントを受け取ることになっていたら?たとえば、コアアニメーションを使用するビューをマウスでドラッグします。適切なマウスイベントを受け取れるように、プレゼンテーションレイヤーの現在の状態とビューフレームを何とかして同期させる方法がありますか?

  • プレゼンテーションレイヤーについては、明らかに実際のアニメーションが進行中の場合のみ利用可能です。アニメーションが進行していなくても実際にどこの視覚的にどこにいるのかを教えてくれるレイヤのプロパティはありますか?

答えて

1

私はあなたの質問を少しフレーズする必要があると思います。根本的な誤解があるようですが、あなたはそれを非常にはっきりと表現していません。あなたはあなたの質問タイトルが示唆していることは、もっと理論的なことを理解しようとしていることを示唆していますが、実際の質問はあなたがもっと具体的なものを探していることを示唆しています。私がいくつかを明確にすることができるかどうかを見てみましょう。

  • プレゼンテーション層「飛行中の」ながらレイヤーの現在の状態についての情報を提供します。何アニメーションが発生していないがある場合

  • プレゼンテーション層情報が同一です。 のレイヤーのの境界、フレーム、または位置を照会して、現在その親の座標空間にある場所を確認します。

  • アニメーションを実行するにはNSViewsにレイヤーバッキングが有効になっている必要があります。

  • 明示的なアニメーションだけではなく、アニメーション化するレイヤーの値を実際に設定していないことを確認してください。アニメーションはアニメートしているレイヤのプロパティを自動的に変更しません。プロパティを終了値に変更する必要があります。開始値に「戻す」だけです。

  • レイヤーとは反対に、ビューをアニメーション化したい場合は、アニメーターのプロキシを使用することができ、[[view animator] setFrame:newFrame];

  • のようなラップは、アニメーションの継続時間のようなものを変更するCATrasactionでアニメーターに呼び出します。

あなたの質問を更新することで明確化が必要な場合は教えてください。適切なコードを提供することは、あなたが問題を解決している問題を特定するのに役立ちます。

1

まず、[self setWantsLayer: YES]を使用します。また、-setLayer:-setWantsLayer:の前に呼び出すことは、特定のCALayerサブクラス(CAScrollLayerなど)を指定する場合にのみ重要です。通常のCALayerがほしいのであれば、-setWantsLayer:と呼んでください。あなたのために作成されます。さらに良い点は、Interface Builderの 'wants layers'オプションをチェックするだけです。

第2に、レイヤーバックビューの使用のポイントは、引き続き通常のNSViewメソッドを使用して、無料のCoreAnimationの「トゥイーン効果」を得ることができることです。アイテムを移動する唯一の手段としてCoreAnimationを使用する場合は、には純粋なCALayerプレゼンテーション階層のが含まれているレイヤーバックビューを作成するのが正しい方法です。

無料のCoreAnimationチュートリアルは見ていませんが、Pragmatic Programmersのbook on the subjectをお勧めします。彼らはまた、本の著者によって利用可能なa screencastを持っています。