【问题标题】:How to have a UIScrollView scroll and have a gesture recognizer?如何让 UIScrollView 滚动并拥有手势识别器?
【发布时间】:2014-07-13 12:15:37
【问题描述】:

我在 UIScrollView 上有一个手势识别器,但是它几乎不会被调用,因为 UIScrollView 会吃掉所有的手势。

我通过这一行部分解决了这个问题:[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipe]; 但是,这行导致我的识别器总是被接受(所需的行为)并且滚动视图不滚动。

也就是说,当你滚动时,识别器被接受但视图不滚动。

我该如何解决这个问题,或者是否有替代解决方案?

谢谢!

【问题讨论】:

    标签: ios objective-c uiview uiscrollview


    【解决方案1】:

    创建UIScrollView 的子类。在你的新子类中添加这个方法

    - (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer 
    {
        return YES;
    }
    

    将你的 scrollView 类设为新的 scrollview 子类。

    【讨论】:

    • 如果有人来这里是因为您的 UIScrollView 中的 UIPanGestureRecognizer 在更新到 Swift 5 后无法正常工作(之前它实际上可以工作) - 这就是解决方案。
    【解决方案2】:

    不要忘记为您的手势识别器机制分配适当的委托:

    所以,例如:

    设置.up方向手势识别器

    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
            swipeUp.direction = .up
            swipeUp.delegate = self // set delegate
            self.addGestureRecognizer(swipeUp)
    

    设置.down方向手势识别器

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
            swipeDown.direction = .down
            swipeDown.delegate = self // set delegate
            self.addGestureRecognizer(swipeDown)
    

    别忘了遵守委托:

    YourViewController: UIGestureRecognizerDelegate
    

    设置同时识别:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
    

    然后继续你的逻辑......

    希望对你有帮助!

    【讨论】:

    • 我喜欢您使用 UIGestureRecognizerDelegate 属性解决了问题。我个人认为这是处理这个问题的正确方法,我对此表示赞同。但是,由于某种原因,我发现向上/向下滑动示例令人困惑。起初我以为您正在尝试手动实现滚动。我建议用 UIPanGestureRecognizer 示例替换上/下滑动示例,以使其简单并专注于委托概念。谢谢。
    【解决方案3】:

    对我有用的方式是子类UIScrollView 并符合该子类中的UIGestureRecognizerDelegate。然后调用这个方法。

    class ATScrollView: UIScrollView, UIGestureRecognizerDelegate { 
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                               shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        } 
    }
    

    【讨论】:

      【解决方案4】:

      快速方法,
      需要将 UIGestureRecognizerDelegate 添加到您的课程中:

      class ViewController: UIViewController, UIGestureRecognizerDelegate {
      

      需要将其委托设置为自身:

      override func viewDidLoad() {
          super.viewDidLoad()
          var scrollView = UIScrollView(frame: self.view.frame)
          scrollView.delegate = self
      }
      

      将此部分添加到您的类方法中以激活同时手势:

      func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
          return true
      }
      

      【讨论】:

      • 我有这个确切的问题,但我尝试的任何方法似乎都不起作用。你能看看我的代码吗?
      • 您有问题吗?
      • 我正在构建一个“google now”类型的界面,并且我有“cards”,它们都是 uiscrollerr 中的所有 uiview,可以滚动或滑出视图,但不能同时进行。我花了最后 3 个小时尝试从 stackoverflow 实现示例,但它从来没有工作:(
      • scrollView 委托是一个scrollViewDelegate,而不是任何类型的手势委托。仅通过您展示的这个设置,“shouldRecognizeSimultaneouslyWithGestureRecognizer”将永远不会被调用。
      【解决方案5】:

      请原谅我的切线,但我发布此答案以防万一其他人做出与我相同的误诊。如果像我一样,上述解决方案对您不起作用,请确保您没有尝试将 UISwipeGestureRecognizer 附加到多个视图。它只能与一个视图一起使用,这将是它最近附加到的视图!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多