私は現在、次の問題に焦点を当てています。
2つのオブジェクト-属性がトリガーされるアニメーションを開始します。
コードは次のとおりです。
[UIView animateWithDuration:0.3 animations:^{
greyscaleImage.alpha = 1;
activityIndicator.alpha = 1;
} completion:^(BOOL f){
if(f)
{
[activityIndicator startAnimating];
}
}];
これは正常に動作します。
私が発見した唯一の問題は、このactivityIndicatorとgreyscaleImageを保持するビューの割り当てが解除されたときに、アプリをクラッシュさせる0.3秒の変更があることです。
より明確にするために、ViewControllerを想像してみてください。そのビューは、デフォルトのiOS-modal-Viewの方法で表示されます。次に、そのアニメーションをトリガーします。これには2分かかります。その2分に達する前に、アニメーションが非常に退屈であることに気付き、そのビューを却下したいとします。これで、ビュー、activityIndicator、およびgreyscaleImageが解放されたため、アニメーションo/cは何をすべきかを知ることができません。
だから私はここで何をすべきか+デバッガがなぜ指すのか疑問に思います
} completion:^(BOOL f){
たとえばの代わりに[activityIndicator.。
2分が経過する前にユーザーがビューを閉じることができるようにする方法はありますか?
宜しくお願いします
0.0秒かかり、目的の状態になる新しいアニメーションを開始すると、古いアニメーションがキャンセルされ、新しい(インスタント)「アニメーション」が開始されます。
移動中のビューを既にある場所に移動して停止する場合の例:
[UIView animateWithDuration:0.0
delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
completion:^(BOOL finished){}
];
options:UIViewAnimationOptionBeginFromCurrentStateは重要です。これを呼び出さないと、前のアニメーションの終了状態からアニメーションが開始されます。移動中は、停止したい場所にワープする前に、終了位置にワープします。キャンセル-「アニメーション」は瞬時に行われますが、前後のジャンプが表示される場合があります。
注:アニメーション時間は0.0秒である必要はありません。どのアニメーションでも、古いアニメーションはキャンセルされます。ただし、さまざまな種類のアニメーションについては完全にはわかりません。たとえば、フレームを変更するとフェードが止まるかどうかはわかりません。
ビューレイヤーからすべてのアニメーションを削除できます
[movingView.layer removeAllAnimations];
アニメーションオプションの設定UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
私のために働きます。
次のように使用します。
[UIView animateWithDuration:0.5
delay:0.0
usingSpringWithDamping:0.7
initialSpringVelocity:0
options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
// Do your stuff here, like changing the frame etc.
self.containerView.frame = CGRectMake(0, 100, 300, 300);
} completion:nil];
ブロックは開始後に常に完了し、停止することはできません(アプリをクラッシュさせない限り)。代わりに、通知センターまたはNSTimerを使用して手動でフレームを変更することをお勧めします。