0

同様の状況に答える投稿がいくつかありますが、なぜこれが起こっているのかを説明しているものはありません。以下のコードを見てください。ここ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];
                     }];
}
4

2 に答える 2

1

あなたは方法を誤解していると思いますzoomToRect:animated:。このrectメソッドで使用される は、によって返されるビューの空間にある必要がありますviewForZoomingInScrollView:(ズームに使用されるビューを返します)。したがって、スクロール ビュー フレームを返す場合で、スクロール ビューの座標が (0,0) でない場合、渡す rect は画面の「中心」にはなりません。

于 2013-10-31T10:28:09.273 に答える
1

Stack Overflow への投稿が役立つことを示す肯定的な証拠。これを投稿するとすぐに、以前に試したことがあると思ったことを試しました。これは機能します:

zoomToRect:animated が期待どおりに機能しない理由を知りたい

-(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];
                         [slider setZoomScale:1.0 animated:NO];
                     }
                     completion:NULL];

}
于 2013-10-30T18:19:49.967 に答える