1

我有 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 中的相邻视图时看起来相同?

4

2 回答 2

1

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

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

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

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

于 2012-08-14T11:35:55.647 回答
1

所以你需要做的如下:

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

现在你的数组又恢复了原来的样子,而用户对此一点也不聪明。

于 2012-08-14T11:37:43.120 回答