0

有几篇帖子回答了类似的情况,但没有人向我解释为什么会发生这种情况。请查看下面的代码,其中slider是 UIScrollView 以及centerRect我们想要在动画完成时查看的 CGRect。目标是在点击时slider缩小到slider.zoomScale1.0 并居中。我尝试了多种方法来做到这一点,并且取得了一些成功,但我目前的解决方案看起来很糟糕。最好的情况是一个平滑的动画,它总是显示相同的最终矩形,在这种情况下恰好居中。

我想知道为什么 zoomToRect:animated 没有达到我的预期,如果你能帮助你了解如何使它更平滑,那将是一个很大的好处。

方法 1:如果放大并滚动到左侧某处,则会缩小但不居中。真的,你应该只需要调用 zoomToRect:animated: 并且效果完全相同。如果 scrollView 未居中,则动画后将不会居中。第二次点击使滚动视图居中。

[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:这可行,但会创建一个笨拙的两部分动画,坦率地说看起来很糟糕。

-(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

证明在 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 回答
1

我想你误解了方法zoomToRect:animated:。此rect方法使用的 必须在返回的视图空间中viewForZoomingInScrollView:(这将返回用于缩放的视图)。因此,如果您要返回滚动视图框架并且滚动视图的坐标不是 (0,0),那么您传递的矩形将不会是屏幕的“中心”。

于 2013-10-31T10:28:09.273 回答