同様の状況に答える投稿がいくつかありますが、なぜこれが起こっているのかを説明しているものはありません。以下のコードを見てください。ここslider
で、 は UIScrollView であり、centerRect
はアニメーションの完了時に確認したい CGRect です。目標は、タップすると 1.0 にslider
ズームアウトし、中央に表示されるようにすることです。slider.zoomScale
これを行うためにさまざまな方法を試しましたが、ある程度成功しましたが、現在の解決策は粗末に見えます。最良のケースは、常に同じ最終四角形を表示する滑らかなアニメーションであり、この状況ではたまたま中央に配置されます。
zoomToRect:animated が期待どおりに機能しない理由と、これをよりスムーズにする方法についてのアイデアを手伝っていただければ、大きなボーナスになります。
方法 1: ズームインしてどこか左にスクロールすると、ズームアウトしますが、中央に配置されません。実際には zoomToRect:animated: を呼び出すだけでよく、これはまったく同じ効果があります。scrollView が中央に配置されていない場合、アニメーション後に中央に配置されません。2 回目のタップで、スクロールビューが中央に配置されます。
[slider zoomToRect:centerRect animated:YES];
[slider scrollRectToVisible:centerRect animated:YES];
方法 2: これは同じように動作します。
-(void) scrollToCenter{
CGRect centerRect = slider.frame;
centerRect.origin.x = (slider.contentSize.width / 2) - (centerRect.size.width / 2);
[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
[slider scrollRectToVisible:centerRect animated:NO];
}
completion:^(BOOL finished){
[slider zoomToRect:centerRect animated:YES];
}];
}
方法 3: これは機能しますが、率直に言って見栄えの悪い 2 部構成のアニメーションが作成されます。
-(void) scrollToCenter{
CGRect centerRect = slider.frame;
centerRect.origin.x = (slider.contentSize.width / 2) - (centerRect.size.width / 2);
[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
[slider setContentOffset:centerRect.origin animated:NO];
}
completion:^(BOOL finished){
[slider setZoomScale:1.0 animated:YES];
}];
}