【问题标题】:ScrollView gesture recognizer eating all touch eventsScrollView 手势识别器吃掉所有的触摸事件
【发布时间】:2013-05-28 18:39:27
【问题描述】:

我有一个UIScrollView,我添加了一个单击手势识别器来显示/隐藏一些 UI 覆盖,使用:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];

和:

- (void)handleTap:(UITapGestureRecognizer *)sender {
    // report click to UI changer
}

我在UIScrollView 的底部添加了一个easy table view。一切正常(水平和垂直滚动),但问题是点击只能被手势识别器识别(上图),而不是简单的表格视图。 如果我删除注册手势侦听器的行,一切正常,表格视图会通知自己点击。

就好像手势识别器函数“吃掉”了表格视图上的点击事件,而不是向下传播它们。

感谢任何帮助

【问题讨论】:

    标签: ios objective-c uiscrollview uitapgesturerecognizer


    【解决方案1】:

    这应该可以解决您的问题。
    Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
    这个想法是告诉手势识别器不要吞噬触摸事件。为此,您需要将singleTap 的cancelsTouchesInView 属性设置为NO,默认为YES

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    singleTap.cancelsTouchesInView = NO;
    [scrollView addGestureRecognizer:singleTap]; 
    

    【讨论】:

    • 我有类似的问题 (my question) 但该解决方案不适用于我。有时会触发事件,有时不会。
    • singleTap.cancelsTouchesInView = NO;多谢兄弟 !!这个解决方案可以帮助我在表格视图中防止 UItouch 事件中断
    • 我也遇到了类似的问题,除了我的突出显示该行(而不是滚动),或者滚动而不突出显示该行(只有长按才能工作)。我通过添加上面的“cancelsTouchesInView = false”来修复它,并确保选中 tableView 的“Can Cancel on Scroll”并且未选中“Delay Touch Down”(两者都可以在 Interface Builder 中轻松找到)
    【解决方案2】:

    Swift 3.0

     let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
     singleTap.cancelsTouchesInView = false
     singleTap.numberOfTapsRequired = 1
     scrollView.addGestureRecognizer(singleTap)
    

    和选择器方法一样。

    @objc func handleTap(_ recognizer: UITapGestureRecognizer) {
      // Perform operation
    }
    

    【讨论】:

    • 我不明白为什么这个解决方案不适合我。如果我用 UIView 完成所有这些工作正常,但如果我通过 UIScrollView 更改 UIView,则停止工作。
    【解决方案3】:

    我认为原因是 User Interaction Enabled 设置为 false 用于 UIImageView。您应该将其设置为 true 以启用其中的点击

    【讨论】:

      【解决方案4】:

      您可以设置要包含/排除触摸的对象。

      - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {            
         if (touch.view == [self view]) {
             return YES;
         }
         return NO;
      }
      

      【讨论】:

        【解决方案5】:

        这在 Swift 3 / Xcode 8

        中对我有用
        self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
        self.scrollView.canCancelContentTouches = false
        

        祝你好运!

        【讨论】:

          【解决方案6】:

          谢谢@zambrey

          Swift 2.2+ 版本:

          scrollView.delegate = self
          
          let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed))
          allowMultipleTouches.numberOfTapsRequired = 1
          allowMultipleTouches.cancelsTouchesInView = false
          
          scrollView.addGestureRecognizer(allowMultipleTouches)
          

          如果您的滚动视图位于 Storyboard 中,请不要忘记将 Outlet 固定在视图控制器中。在此示例中,scrollViewUIScrollView 的 Outlet。

          【讨论】:

            【解决方案7】:

            TapGestures 为我工作。另一方面,滑动,我不得不禁用滚动并且它起作用了。

            swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
            swipeLeftGesture.direction = .left
            scrollView.addGestureRecognizer(swipeLeftGesture)
            
            swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
            scrollView.addGestureRecognizer(swipeRightGesture)
            
            scrollView.isScrollEnabled = false
            

            【讨论】:

            • 当我这样做时,我的 scrollView 将无法以编程方式滚动(它会压缩元素以适合其容器)
            【解决方案8】:

            您可以在 UIscrollView 中捕捉任何类型的手势。确保您还处理了一些默认属性,例如将 cancelsTouchesInView 属性设置为 false,默认情况下为 true。 还要为您的子视图提供一些标签号,以在选择器中进行区分。 并且还使他们的用户交互成为真实的。

            让点击 = UITapGestureRecognizer(目标:自我,动作:

            选择器(didTapByUser(_:)))

            【讨论】:

              【解决方案9】:

              我的代码。

              我检查了所有建议的解决方案和任何适合我的工作。我不理解为什么。我不明白原因。

              class MyClass: UITableViewController {
              
              override func viewDidLoad() {
                  super.viewDidLoad()
              
              let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
              
              scrollView.contentSize = CGSize(width: UIScreen.main.bounds.size.width, height: 800)
              
              scrollView.isUserInteractionEnabled = true
              scrollView.delegate = self
              
              let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(manageGesture))
              
              tap.cancelsTouchesInView = false
              
              tap.numberOfTapsRequired = 1
              
              scrollView.addGestureRecognizer(tap)
              
              scrollView.canCancelContentTouches = false
              
              self.view.addSubview(scrollView)
              
              }
              
              @objc func manageGesture(){
                  // Some action
              }
              
              
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-11-29
                • 2018-08-19
                • 2018-05-07
                • 2018-12-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多