【问题标题】:Deactivate UIScrollView decelerating停用 UIScrollView 减速
【发布时间】:2010-11-09 11:46:48
【问题描述】:

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

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

【问题讨论】:

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

标签: iphone cocoa-touch iphone-sdk-3.0 uiscrollview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    以前的 Swift 版本:↓

    scrollView.decelerationRate = UIScrollView.DecelerationRate.fast
    

    当前 Swift 4.2 版本代码:↓

    scrollView.decelerationRate = UIScrollViewDecelerationRateFast
    

    【讨论】:

      【解决方案3】:

      只需将 decelerationRate 属性设置为 0

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

      【讨论】:

        【解决方案4】:

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

        实施:

        1. 如果您还没有为您的UIScrollView 对象分配一个代理。
        2. 在您的委托的.m 实现文件中,添加以下代码行:

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

        瞧!不再自动滚动。

        【讨论】:

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

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

        scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;
        

        scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
        

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

        【讨论】:

        • 感谢您的回答!我尝试了 decelerationRate 属性的各种值,但没有设法使减速看起来不存在。快速滑动总是会使滚动视图滚动相当大的量。
        • 根据我的经验,decelerationRate 属性仅响应文档中说明的值:UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast
        • 这就是我要寻找的。谢谢:)
        • 这很棒,因为它仍然使内容不会超出所需的范围。在实施其他选项时,我可以将内容平移到比预期更远的地方。
        • 如果你想防止这种情况发生设置scrollView.bounces = false
        猜你喜欢
        • 2011-01-03
        • 2012-05-10
        • 2013-08-26
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2013-01-15
        相关资源
        最近更新 更多