我如何以编程方式强制停止在UIScrollView滚动?

注意: 这里给出的答案不适用于我。

我有一个UIScrollView(不是一个表视图,只是一个自定义的事情),当用户采取某些行动,我想杀死视图内的任何滚动(拖动或减速)。 我试过这样做:

[scrollView scrollRectToVisible:CGRectInset([scrollView bounds], 10, 10) animated:NO]; 

理论上说,给定一个已知的矩形,滚动将停止在原来的位置,但事实certificate这并没有任何效果 – 显然滚动视图看到给定的矩形处于界限内没有行动。 我可以让滚动停止,如果我给一个rect,肯定是在当前可见边界之外,但在视图的contentSize内部。 这似乎停止了预期的看法…但也导致它跳转到其他位置。 我大概可以在边缘玩一下,让这个工作合理的,但是有没有人知道一个干净的方法来停止正在做它的事情的滚动视图?

谢谢。

我玩了你原来的解决scheme,这似乎工作得很好。 我想你已经差不多了,但是你只是抵消了你用得太多的情况,而忘记了你可以直接将矩形滚动回原来的矩形。

任何滚动操作的广义解决scheme是这样的:

 - (void)killScroll { CGPoint offset = scrollView.contentOffset; offset.x -= 1.0; offset.y -= 1.0; [scrollView setContentOffset:offset animated:NO]; offset.x += 1.0; offset.y += 1.0; [scrollView setContentOffset:offset animated:NO]; } 

[编辑]从iOS 4.3(也可能更早),这似乎也工作

 - (void)killScroll { CGPoint offset = scrollView.contentOffset; [scrollView setContentOffset:offset animated:NO]; } 

对我来说, 大卫·雷(David Lui)上面接受的答案对我来说并不合适。 这就是我最终做的事情:

 - (void)killScroll { self.scrollView.scrollEnabled = NO; self.scrollView.scrollEnabled = YES; } 

为了什么是值得的,我正在使用iOS 6.0的iPhone模拟器。

实际的一般答案是, [scrollView setContentOffset:offset animated:NO] 不同于 [scrollView setContentOffset:offset]

  • [scrollView setContentOffset:offset animated:NO]实际上会停止任何正在运行的animation。
  • [scrollView setContentOffset:offset]不会停止任何正在运行的animation。
  • 相同的scrollView.contentOffset = offset :不会停止任何正在运行的animation。

这在任何地方都没有logging,但是这是在iOS 6.1和iOS 7.1上testing的行为 – 可能以前也是如此。

所以停止运行animation/减速的解决scheme很简单:

 [scrollView setContentOffset:scrollView.contentOffset animated:NO]; 

那么,刘大卫基本上是在他编辑的答案中说的。 但是我想说清楚,这两个API是一样的。

其实…最“现代”的方式是 – >

 scrollview.panGestureRecognizer.enabled = false; scrollview.panGestureRecognizer.enabled = true; 

这将停用手势识别器,该手势识别器负责滚动一会儿,这将杀死当前的触摸。 用户需要抬起手指并放下,才能开始再次滚动。

编辑:这实际上只是杀死当前拖动的用户,但不会立即停止减速如果滚动视图目前处于这种状态。 要做到这一点接受的答案编辑几乎是最好的方式xD

 [scrollview setContentOffset: scrollview.contentOffset animated:false]; 

这是我为我的滚动视图和所有其他相关的子类:

 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { *targetContentOffset = scrollView.contentOffset; } 

这将targetContentOffset设置为scrollView的当前偏移量,从而使滚动停止,因为它已经到达目标。 实际上使用一个方法的目的是用户可以设置目标contentOffset

迅速

 func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { targetContentOffset.pointee = scrollView.contentOffset } 

最简洁的方法将inheritanceUIScrollView并提供您自己的setContentOffset方法。 只有当你没有打开你的freeze布尔属性时,这应该传递消息。

像这样:

 BOOL freeze; // and the @property, @synthesize lines.. -(void)setContentOffset:(CGPoint)offset { if ( !freeze ) [super setContentOffset:offset]; } 

然后,冻结:

 scrollView.freeze = YES; 

迅速停止滚动:

 scrollView.setContentOffset(scrollView.contentOffset, animated: false) 

这个答案为我工作: 取消UIScrollView减速

 -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ [scrollView setContentOffset:scrollView.contentOffset animated:YES]; } 

我已经在collectionview中试过这个方法:

self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()