【问题标题】:Use custom gesture recognizer to trigger scrolling of UIScrollView使用自定义手势识别器触发 UIScrollView 的滚动
【发布时间】:2014-12-04 10:25:20
【问题描述】:

我找不到替换UIScrollView 的默认UIPanGestureRecognizer 的方法。但是我需要调整导致UIScrollView 滚动的手势。

我只想识别速度更快的平底锅。另外,手指的速度是在移动一定距离后才测量的(以确保它不是最初的慢动作)。据我所知,UScrollView 的默认 UIPanGestureRecognizer 无法实现这一点。

如何用我自己的识别器替换它?

【问题讨论】:

  • 你使用的是 Objective-C 还是 Swift?
  • @A.R.Younce 我正在使用 Swift。但是使用 Objective-C 可以实现的一切都应该使用 Swift 实现,对吧?
  • 目前 UIGestureRecognizer 的自定义子类不能用 Swift 编写。我只是想知道帮助提出示例代码。
  • @A.R.Younce 随意用 Objective-C 编写它。我找到了一种方法来继承UIGestureRecogniser。虽然它有一个缺点,但我可以忍受 - 所以请随意在 Objective-C 中发布,我可以将该代码改编为 Swift。
  • @A.R.Younce 如果你对我如何对UIGestureRecognizer 进行子类化感兴趣:添加import UIKit.UIGestureRecognizerSubclass

标签: ios uiscrollview gesture gesture-recognition


【解决方案1】:

更改底层手势识别器是错误的方法。你想做的事情大概可以通过实现UIGestureRecognizerDelegategestureRecognizer(_:shouldReceiveTouch:)方法来完成。

只要您要自定义的滚动视图不是 UICollectionView、UITableView 或类似类的一部分,那么您就可以设置手势识别器的委托。然后,您可以在委托中使用 UIPanGestureRecognizer 的 velocityInView(_:) 方法来决定是否要允许手势识别器触发滚动。

【讨论】:

  • 谢谢,但我不同意。目前,我已经在使用委托——不是方法shouldReceiveTouch,而是gestureRecognizerShouldBegin。它不做需要的事情。通过仅使用代理过滤触摸来完成我需要的事情可能是可能的,但非常复杂。更重要的是 - 它正在破解UIPanGestureRecognizer 以识别不同的手势,然后通过其代表进行平移。绝对不是正确的方法。并且代表不是它的肉,因此它没有提供足够的控制。它根本不是同一个手势,我需要不同的识别器。
  • 不鼓励操作 UIKit 框架类的手势识别器,原因与操作它们的私有视图相同。当他们进行内部更改时,您的应用程序可能会中断。如果使用委托对您不起作用,那么您可能需要一个自定义滚动视图(不是 UIScrollView 子类)。
  • 好吧,如果无法以某种记录方式替换默认的平移识别器,我将需要做更多的编码,以重新创建整个拖动和滚动功能——就像你建议的那样。但在此之前,我会在这个问题上设置一个赏金,看看会产生什么结果。谢谢
【解决方案2】:

您也可以在这里实现 touchesMoved 方法。您可以在触摸之间进行比较以检查速度。类似这样的东西,但它是伪代码

global firstpoint;
global secondpoint

override func touchesBegan(touches: NSSet, withEvent event: UIEvent){

for touch: AnyObject in touches {
        let firstpoint = (touch as UITouch).locationInNode(self);

}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

    for touch: AnyObject in touches {
        let secondpoint = (touch as UITouch).locationInNode(self);
    }
    let diffx = secondpoint - firstpoint;
    if diffx > "some value you choose for velocity"{
         "do some action that you want";
    }
    else {
        firstpoint = secondpoint;
    }
}   

这将为您提供一些运动速度,您可以使用它来提供进一步的动作。

【讨论】:

    【解决方案3】:

    您可以尝试在 scrollView 上放置一个清晰的 UIView,然后可以向其添加一个 UIPanGestureRecognizer。然后,您将能够为该 GestureRecognizer 设置一个选择器,然后该选择器可以告诉 scrollView 滚动。但随后您将负责确定每个高速平移的滚动距离。

    【讨论】:

    • 我可以将UIPanGestureRecognizer 直接添加到UISrollView 并通过设置scrollEnabled = false 禁用默认值(或者通过在滚动视图上实现UIGestureRecognizerDelegate 的方法shouldReceiveTouch 并始终返回@ 987654326@)。确定高速平底锅滚动多远也不是问题。我的想法是我不想松动弹跳和分页 - 当contentOffset 或可见矩形以编程方式设置在UIScrollView 时,它不会弹跳也不会移动到最近的页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2014-07-13
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多