停用 UIScrollView 减速

Posted

技术标签:

【中文标题】停用 UIScrollView 减速【英文标题】:Deactivate UIScrollView decelerating 【发布时间】:2009-07-09 18:17:49 【问题描述】:

有没有办法取消 UIScrollView 的减速?

我想允许用户滚动画布,但我不希望用户抬起手指后画布继续滚动。

【问题讨论】:

Adam,我知道不建议更改默认行为,但我认为在我的特殊情况下这是有道理的。我正在实现一个扩展的画布,它能够直接在画布上编辑对象。进入此画布编辑模式时,我想限制用户滚动的距离,以使对象始终处于可见范围内。允许使用进一步滚动,但它会在手指向上反弹。我知道 contentSize 属性,但它会干扰我不断增长的画布。 在我的情况下,我们正在做有偿雇佣工作,客户要求我们取消减速运动。 【参考方案1】:

这可以通过使用UIScrollView 委托方法scrollViewWillBeginDecelerating 自动将内容偏移设置到当前屏幕位置来完成。

实施:

    如果您还没有为您的UIScrollView 对象分配一个代理。

    在您的委托的.m 实现文件中,添加以下代码行:

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

瞧!不再自动滚动。

【讨论】:

我的跳到减速结束的地方回到开始的地方......有什么建议吗? 我发现使用这种方法会干扰正在缩放的​​视图中的触摸事件。 (在我的情况下,视图中有一些按钮在缩小时变得不活动。)使用下面的报价修复解决了这个问题。 这似乎确实有效,但我很犹豫要不要使用似乎没人能解释的东西。马克,你能解释一下为什么会这样吗? Thomas Clowes:上面的解决方案是很久以前写的,有点像 hack。当滚动视图减速动画开始时,它调用委托方法scrollViewWillBeginDecelerating,而我的一行代码只是手动强制内容偏移(认为这是滚动视图的可见部分)保持在它已经在的任何位置,强迫没有视觉变化。这些天来,我建议使用下面引用的委托方法。将 targetContentOffset 设置为当前偏移量以防止运动。【参考方案2】:

对于 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 自动滚动。

【讨论】:

【参考方案3】:

你可以把减速率调得很高。以无限的速度,它会立即停止。尝试将速率设置为这些常量:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

如果速度对您来说还不够快,UIScrollViewDecelerationRateFast 只是类型定义为浮点数,因此您只需将其乘以 10 倍左右即可进一步加快速度。

【讨论】:

感谢您的回答!我尝试了 decelerationRate 属性的各种值,但没有设法使减速看起来不存在。快速滑动总是会使滚动视图滚动相当大的量。 根据我的经验,decelerationRate 属性仅响应文档中说明的值:UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast 这就是我要寻找的。谢谢:) 这很棒,因为它仍然使内容不会超出所需的范围。在实施其他选项时,我可以将内容平移到比预期更远的地方。 如果你想防止这种情况发生设置scrollView.bounces = false【参考方案4】:

只需将 decelerationRate 属性设置为 0

它将禁用自动滚动属性。但请记住,如果滚动视图内容大小很大,用户交互会变得很糟糕。

【讨论】:

【参考方案5】:

以前的 Swift 版本:↓

scrollView.decelerationRate = UIScrollView.DecelerationRate.fast

当前 Swift 4.2 版本代码:↓

scrollView.decelerationRate = UIScrollViewDecelerationRateFast

【讨论】:

以上是关于停用 UIScrollView 减速的主要内容,如果未能解决你的问题,请参考以下文章

调整容器 uiscrollview 中所有 uiscrollview 的大小

预测减速后 UIScrollView 中的静止偏移量

何时使用 UITouch 与 UIScroll

UIScroll 及其嵌套元素

UIScroll 视图未按预期工作

以编程方式滑动 UIScrollView