8

iOS では、アニメーション ブロックを使用してビュー オブジェクトをアニメーション化できます。

[UIView animateWithDuration:1.0 animations:^{

        firstView.alpha = 0.0;

        secondView.alpha = 1.0;

}];

ここにあるのは、アニメーションの終了後にビュー プロパティが最終的にどのようになるかを記述したコード ブロックです。

これはどのように作動しますか?

これが何らかの宣言形式を使用して行われたかどうかは理解できますが (私はそう思います)、アニメーション ブロックは通常のコードであり、おそらく実行し、結果を検査し、誰かが実際のコードにトランスコードする必要があります。アニメーションを実行する下位レベルのグラフィック コード。

ブロックは実際に実行されますか (または何らかの形でリバース エンジニアリングされますか)、実行される場合はいつですか?

アニメーションが開始する前にこのコードを実行すると、参照されているビュー プロパティへの変更がすぐに反映されないのはなぜですか?

ビューのプロパティを変更せず、何か他のことを行うコードをブロックに入れるとどうなりますか?

4

3 に答える 3

8

はい、実際にブロックが呼び出され、ビューのプロパティがすぐに変更されます。UIView のプロパティ セッターは、セットがアニメーション コンテキスト内で使用されたかどうかを確認する責任があります。使用されている場合は、CoreAnimation と CoreGraphics を使用してアニメーション フレームなどを計算します。

これらのブロックにアニメーション以外のコードを入れても、特別なことは何も起こらず、ブロックはすぐに実行されます。

于 2012-07-13T08:57:12.533 に答える
6

ブロックの前にある同等のコードを見ると、有益です。

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0];
firstView.alpha = 0.0;
secondView.alpha = 1.0;
[UIView commitAnimations];

ご覧のとおり、ブロックの前であっても、変更するプロパティも直接設定されています。ただし、すぐには反映されません (アニメーション化されます)。

それはどのように機能しますか?おそらく、ビューにプロパティを設定すると、実行されているが実行されてbeginAnimationsいないかどうかがチェックされ、実行されcommitAnimationsている場合はすぐには有効になりません (むしろ、そのアニメーションでアニメーション化するもののリストに追加されます)。

したがって、ブロック バージョンが行うことは、プレ ブロック バージョンのコンテキストでは非常に単純です。つまり、アニメーション ブロックを内部beginAnimationscommitAnimationsラインで実行していると考えることができます。

于 2012-07-14T20:46:36.083 に答える
1

Apple は、それがどのように機能するかについての詳細についてはあまり語っていませんが、私は次のように考えています。

ビューがビュー階層に追加されると、ビューのアニメーション化可能なすべてのプロパティに KVO オブザーバーが追加されます。

アニメーション ブロックが実行されると、システムはそれらのプロパティで KVO 通知を監視する状態を設定します。呼び出されたコードは、適切な CAAnimation オブジェクトを作成し、影響を受ける各ビューのレイヤーに追加します。

于 2012-07-13T15:36:11.747 に答える