ScrollView手势识别器吃掉所有触摸事件

Ita*_*ski 39 objective-c uiscrollview ios uitapgesturerecognizer

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

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];
Run Code Online (Sandbox Code Playgroud)

和:

- (void)handleTap:(UITapGestureRecognizer *)sender {
    // report click to UI changer
}
Run Code Online (Sandbox Code Playgroud)

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

这就好像手势识别器功能"吃掉"表视图上的点击事件并且不向下传播它们.

任何帮助表示赞赏

zam*_*rey 76

这应该可以解决您的问题.
检测UIScrollView上的触摸事件和UIView的组件[放置在UIScrollView中]
这个想法是告诉手势识别器不要吞下触摸事件.要执行此操作,您需要将singleTap的cancelsTouchesInView属性设置NOYES,默认情况下.

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

  • 我有类似的问题([我的问题](http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is-visible))但该解决方案不适用于我.有时事件会被触发,有时则不会. (3认同)

Jay*_*eep 12

Swift 3.0

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

选择器方法就像.

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
  // Perform operation
}
Run Code Online (Sandbox Code Playgroud)


san*_*ony 6

您可以设置要包含/排除哪些对象进行触摸.

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


Ran*_*Tek 6

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


小智 5

这在Swift 3 / Xcode 8 中对我有用

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
self.scrollView.canCancelContentTouches = false
Run Code Online (Sandbox Code Playgroud)

祝你好运!