在没有动画的情况下滚动到UIScrollView中的特定视图

时间:2012-08-14 10:41:26

标签: ios animation uiscrollview core-animation

我有UIScrollView和大约20个项目(UIViewControllers)。我每个页面上都有按钮,帮助我在这20个项目之间跳转。所以,如果我在第一个视图,并按下按钮,将我带到第18项,整个滚动视图滚动到该视图和动画滚动操作,所以我能够看到第1和第18项之间的所有视图。

是否可以在没有这个长动画的情况下从滚动视图中的第1个项目跳到第18个项目(我希望看到动画,就像我在两个相邻项目之间滚动一样)?

我认为这行代码可以帮助我阻止这种长滚动动画:

[scrollView scrollRectToVisible:rect animated:NO];

但没有运气。

有什么建议吗?

[编辑#1] 我滚动到特定视图的方法如下所示:

// I found view controller to which I want to scroll

CGRect rect = selectedViewController.view.frame;

float duration; // I calculate animation duration in some way now

[UIView beginAnimations:@"ScrollRectToVisible" context:nil];
[UIView setAnimationCurve:UIViewAnimationTransitionNone];

[scrollView scrollRectToVisible:rect animated:NO];
[UIView commitAnimations];

使用此代码,当我在UIScrollView中从第一个视图滚动到最后一个视图时,应用程序滚动到最后一个视图,并且该动画将持续我计算的持续时间值。我看到第一个和最后一个之间存在的每个视图。我的愿望是立即从第一个视图滚动到最后一个视图,而不会看到它们之间的所有视图。

当我将crollRectToVisible行改为:

[scrollView scrollRectToVisible:rect animated:YES];

同样的事情发生了,这次滚动动画的发生速度提高了5倍,但仍然显示了所有视图。

当我从方法中删除动画时,立即发生转换。我的问题是如何在UIScrollView中滑动到邻居视图时实现这个看起来相同的动画?

2 个答案:

答案 0 :(得分:1)

唯一可能不显示这两者之间所有观点的方法是......根本没有它们,或者使它们不可见。

但是,可能不满足您的简单解决方案是将所有视图的alpha设置为零,然后滚动。问题是它会滚动得非常快,我想。

另一个更复杂的解决方案是删除那些视图,或者再次将其alpha设置为零,但将目标视图移到第一个旁边 - 这将为您提供所需的效果。在此滚动之后,您应该将该视图移回其原点并同时滚动到它的原点(通过更改contentOffset) - 然后用户将不会注意到它,然后将所有视图返回到屏幕。

所以它看起来就像某种缩小你的滚动视图。

答案 1 :(得分:1)

所以你需要的是如下:

  • 假设您有5个视图,a,b,c,d,e
  • 你在'b'并希望动画为'e',好像'e'在'b'旁边,而不是'c'或'd'
  • 当用户点击按钮表示他们想要看到'e'时,您将首先交换'c'和'e'
  • 你想要从'b'到'e'(现在是它的邻居)的动画
  • 当动画停止时(您应该使用带有完成块的块动画),您可以执行以下所有操作:
    • swap'c'和'e'
    • 设置scrollView的contentOffset,使水平值为'e'

现在你的阵列已经恢复了原样,用户也不是更明智的。