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

问题描述:

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

是否有可能从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中的邻居视图?

+0

你的意思是没有运气?没有变化或动画,你不想要发生? – 2012-08-14 10:44:49

+1

尝试setContentOffset – 2012-08-14 10:44:52

+0

@Nikita Pestrov:我现在将编辑原始问题以回答您的问题。 – uerceg 2012-08-14 10:52:49

所以你需要什么,所以为:

  • 假设你有5次,A,B,C,d,E
  • 你在 'B',并希望以动画为' e'好像'e'在'b'旁边,没有显示'c'或'd'
  • 当用户点击一个表示他们想看到'e'的按钮时,您将首先将'c'和' e'
  • 从'b'到'e'(现在是它的邻居),您可以生成动画
  • 当动画停止时应该使用块动画与完成块),你做的这一切:
    • 交换“C”和“E”
    • 设置了滚动的contentOffset因此水平值,其中“E”是

现在你的数组又恢复了原来的样子,用户对它没有任何智慧。

+0

非常感谢您的回答,这似乎是非常有趣的解决方案。你能否指出我如何访问UIScrollView对象中的项目以便能够交换它们? – uerceg 2012-08-14 12:20:53

+0

你说你有一个有20个对象的scrollView。这似乎意味着你有20个视图,每个视图添加为scrollView的子视图(或者你创建了一个容器视图并将20个项目添加到该视图。)每个项目都有一个框架(我假设),以便每个框架都紧靠它旁边的视图。这些是你的'a','b','c'项目。要“重新排序”它们,您应该只能交换帧值(只要它们不重叠) – 2012-08-14 13:24:32

+0

感谢David,就是这样。非常感谢解决方案,就我而言,这是我的问题的答案,很好,很容易。 – uerceg 2012-08-15 06:33:08

唯一可能的途径不显示所有两者之间的观点是... ...而不是让他们在所有的,或使其不可见。

的简单的解决方案,即不能满足你,虽然是对所有这些之间的视图的α设定为零,然后滚动。问题是,它会滚动真快,我猜。

另外一个更复杂的解决方案,是旁边都删除了这些意见,或将他们的阿尔法再次为零,但移动该目标以第一个,这会给你想要的效果。滚动后,您应该将该视图移回到原点,并同时滚动到原点(通过更改contentOffset) - 所以用户不会注意到它,然后将所有视图都带回屏幕。

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

+0

感谢Nikita,我试过David的建议。但谢谢你的回答! – uerceg 2012-08-15 06:32:21

+0

事实上,他建议我做同样的事情) – 2012-08-15 09:08:33

+0

是的,我明白,他只是第一个回答我的问题,我试图通过他的指示解决我的问题。同样的事情,你已经建议,如果我能我会标记两个答案是正确的。非常感谢一次。 – uerceg 2012-08-15 09:40:50