ご存知のように、Appleは、iOS4.0上のアニメーションについてブロックベースのアニメーションと呼ばれる新しい方法を使用することをお勧めします。
ブロックベースのアニメーションが開始/終了スタイルのアニメーションよりも優れているのは本当に不思議です。
パフォーマンス?
並行性?
コーディングの効率と利便性?
ご存知のように、Appleは、iOS4.0上のアニメーションについてブロックベースのアニメーションと呼ばれる新しい方法を使用することをお勧めします。
ブロックベースのアニメーションが開始/終了スタイルのアニメーションよりも優れているのは本当に不思議です。
パフォーマンス?
並行性?
コーディングの効率と利便性?
当時もこれが気になりました。
しかし、次のようなブロックベースのアニメーションを使用した後:
[UIView animateWithDuration:0.5 ... ^{
// animated custom view vertically
} completion:^{
[UIView animateWithDuration:0.5 ... ^{
// animate the fade in alpha of buttons
}];
}];
短く簡潔な方法で完了ハンドラーを提供します。サブアニメーションブロックを相互にネストすることもできます。
BeginAnimation / EndAnimationでは、完了ハンドラーのコールバックを実行する方法を正確に思い出せませんが、通常は次のようなことを行います。
//アニメーションを開始します//デリゲートを設定します//beginAnimationごとにデリゲートコールバック関数を作成します
ここで、CSSライトボックス効果の複製など、3レベルまたは4レベルのアニメーションをネストする場合を想像してみてください。
1)ライトボックスコンテナでフェードイン
2)幅を広げる
3)高さを拡張します
4)フォームのフェード
かなり厄介なif-else状態に対処する必要があります。
ワークフローは次のようになります。
「このbeginAnimationの終了後、コールバックメソッドにメッセージを送信し、Xcodeを下にスクロールしてコールバックデリゲートメソッドを見つけます。次に、コールバックメソッドで別のUIView beginAnimationを呼び出し、Xcodeを上にスクロールして次のbeginAnimationを見つけます...」
ブロックベースのアニメーションでは、各プロセスがブロックにカプセル化され、別のブロックにネストできます。順序を変更することにした場合は、次のように表示されます。
1)ライトボックスコンテナでフェードイン
2)今回は幅の前に高さを展開します
3)今回は高さの後に幅を広げます
4)フォームのフェード
beginAnimationアプローチを使用すると、髪の毛を抜くことができます。
お役に立てば幸いです。
非常に便利です。
ブロックを使用することでパフォーマンスを向上させる方法はほとんどありません。ですから、その中には何もありそうにありません。アニメーションのすべてのブロック構文は、古いメソッドを呼び出して(または、同様の内部メソッドを呼び出して効果的に実行し)、beginAnimationとcommitAnimationを実行する場所の間にブロックを実行するだけだと思っていました。
だから、便利。とにかくその理由だけでそれを使用することをお勧めします。使用がはるかに簡単で、完了時に呼び出す他のメソッドを作成する必要がないため、アニメーションのネストや完了時の処理が簡単になります。これは単なる別のブロックです。