3 つのオプションがあります。
メソッドを使用する-[UIView animateWithDuration:…]
と、ブロックで行った変更がanimations
問題のビューにすぐに適用されます。CAAnimation
ただし、古い値から新しい値にアニメーション化するビューに暗黙的に適用されるものもあります。CAAnimation
ビューで がアクティブな場合、表示されるビューは変更されますが、ビューの実際のプロパティは変更されません。
たとえば、次のようにします。
NSLog(@"old center: %@", NSStringFromCGPoint(someView.center));
[UIView animateWithDuration:2.0 animations: ^{ someView.center = newPoint; }];
NSLog(@"new center: %@", NSStringFromCGPoint(someView.center));
「古い中心」と「新しい中心」が異なることがわかります。newcenter は newPoint の値をすぐに反映します。ただし、CAAnimation
暗黙的に作成された により、ビューは引き続き古い中心に表示され、スムーズに新しい中心に移動します。アニメーションが終了すると、ビューから削除され、実際のモデル値のみが表示されるように戻ります。
を渡すUIViewAnimationOptionAutoreverse
と、暗黙的に作成された に影響CAAnimation
しますが、値に加えている実際の変更には影響しません。つまり、上記の例で がUIViewAnimationOptionAutoreverse
定義されている場合、暗黙的に作成されたCAAnimation
は oldCenter から newCenter へ、またその逆にアニメーション化されます。アニメーションは削除され、設定した値に戻りますが、まだ新しい位置にあります。
前述したように、これに対処するには 3 つの方法があります。1 つ目は、アニメーションに完了ブロックを追加して、次のように反転させることです。
最初のオプション
CGPoint oldCenter = someView.center;
[UIView animateWithDuration:2.0
animations: ^{ someView.center = newPoint; }
completion:
^(BOOL finished) {
[UIView animateWithDuration:2.0
animations:^{ someView.center = oldCenter; }];
}];
2 番目のオプション
2 番目のオプションは、現在行っているようにアニメーションを自動反転し、完了ブロックでビューを元の位置に戻すことです。
CGPoint oldCenter = someView.center;
[UIView animateWithDuration:2.0
delay:0
options: UIViewAnimationOptionAutoreverse
animations: ^{ someView.center = newPoint; }
completion: ^(BOOL finished) { someView.center = oldCenter; }];
ただし、これにより、アニメーションのオートリバースが完了してから完了ブロックが実行されるまでの間にちらつきが発生する可能性があるため、おそらく最適な選択ではありません。
3 番目のオプション
最後のオプションは、単純にCAAnimation
直接作成することです。変更するプロパティの最終的な値を実際に変更したくない場合は、多くの場合、これの方が簡単です。
#import <QuartzCore/QuartzCore.h>
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.autoreverses = YES;
animation.repeatCount = 1; // Play it just once, and then reverse it
animation.toValue = [NSValue valueWithCGPoint:newPoint];
[someView.layer addAnimation:animation forKey:nil];
CAAnimation
物事を行う方法がビューの実際の値を変更することは決してないことに注意してください。アニメーションで実際の値をマスクするだけです。ビューはまだ元の場所にあると考えています。(これは、たとえば、ビューがタッチ イベントに応答する場合、それらのタッチ イベントが元の場所で発生するのを引き続き監視することを意味します。アニメーションは、ビューの描画方法のみを変更し、それ以外は何も変更しません。
このCAAnimation
方法では、ビューの基になる に追加することも必要ですCALayer
。これが怖い場合は、-[UIView animateWithDuration:…]
代わりにメソッドを自由に使用してください。を使用して追加の機能を利用できますCAAnimation
が、慣れていない場合は、UIView アニメーションをチェーンするか、完了ブロックでリセットすることで問題ありません。実際、それが完了ブロックの主な目的の 1 つです。
では、どうぞ。アニメーションを逆にして元の値を維持する 3 つの方法。楽しみ!