有几篇帖子回答了类似的情况,但没有人向我解释为什么会发生这种情况。请查看下面的代码,其中slider
是 UIScrollView 以及centerRect
我们想要在动画完成时查看的 CGRect。目标是在点击时slider
缩小到slider.zoomScale
1.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];
}];
}