禁用UIScrollView的减速功能

40

有没有办法停用UIScrollView的减速功能?

我想允许用户滚动画布,但是我不希望画布在用户松开手指后继续滚动。


5
Adam,我知道改变默认行为不被推荐,但是在我的特殊情况下,我认为这样做是有意义的。我正在实现一个扩展画布,具有直接在画布上编辑对象的功能。进入此“画布上编辑”模式时,我希望限制用户滚动的距离,以使对象始终在可见范围内。用户可以滚动更远,但它会在手指抬起后反弹回来。我知道contentSize属性,但它会干扰到我的不断增长的画布。 - Markus Müller-Simhofer
2
在我的情况下,我们正在进行有偿雇佣工作,客户要求我们删除减速运动。 - Mark
5个回答

72

可以通过利用UIScrollView的委托方法scrollViewWillBeginDecelerating自动将内容偏移设置为当前屏幕位置来实现。

实现方法:

  1. 如果尚未这样做,请将委托分配给您的UIScrollView对象。
  2. 在委托的.m实现文件中,添加以下代码行:

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

    完成了!不再自动滚动。


我的跳到了减速结束的地方,然后又回到了起点... 有什么建议吗? - jjxtra
我发现使用这种方法会干扰被缩放视图中的触摸事件。(在我的情况下,当缩小时,视图中的一些按钮变得不活动。)使用 Quotation 给出的修复方法解决了这个问题。 - rob
这似乎是有效的,但我不确定是否应该使用没有人能够解释的东西。Mark,你能解释一下为什么这个有效吗? - Thomas Clowes
Thomas Clowes:上面的解决方案早已编写完成,但有些不太正规。当滚动视图减速动画开始时,它会调用委托方法scrollViewWillBeginDecelerating,而我的一行代码只是手动强制内容偏移(将其视为滚动视图的可见部分)保持在任何位置,从而不强制进行任何视觉更改。现在,我建议使用Quotation指出的下面的委托方法。将targetContentOffset设置为当前偏移量以防止运动。 - Mark

44

针对 iOS 5.0 及以上版本,有一种比调用 setContentOffset:animated: 更好的方法。

在你的 .m 文件中实现代理方法 scrollViewWillEndDragging:withVelocity:targetContentOffset:

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

将当前的偏移量分配给targetContentOffset,可以停止UIScrollView的自动滚动。


21

您可以将减速率设置得非常高。在无限制的情况下,它会立即停止。尝试将速率设置为以下常量:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;
并且
scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

如果快速仍然不够快,UIScrollViewDecelerationRateFast 只是被定义为一个浮点数,所以你可以将它乘以10或者更多的系数来进一步加速。


谢谢您的回答!我尝试了各种减速率属性的值,但是无法使减速效果消失。快速滑动总是会使滚动视图滚动相当多的距离。 - Markus Müller-Simhofer
12
根据我的经验,decelerationRate 属性只会响应文档中明确说明的值:UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast - Tim Arnold
这就是我在寻找的东西。谢谢 :) - codeburn
1
这很棒,因为它仍然使内容不超过所需的边界。当实现其他选项时,我可能会将内容滚动得比所需的更远。 - Clay Garrett
1
如果你想要防止这种情况发生,可以设置 scrollView.bounces = false - Josh Bernfeld

1

只需将decelerationRate属性设置为0即可。

这将禁用自动滚动属性。但请注意,如果scrollview的contentsize很大,用户交互将变得不好。


-2

之前的 Swift 版本:↓

scrollView.decelerationRate = UIScrollView.DecelerationRate.fast

当前的Swift 4.2版本代码:↓

scrollView.decelerationRate = UIScrollViewDecelerationRateFast

与问题完全无关 - Fattie
请参见“[答案]”和完全基于代码的解释。虽然这可能在技术上是正确的,但它并没有解释为什么它可以解决问题或应该被选为答案。我们应该在帮助解决问题的同时进行教育。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接