ScrollView手势识别器吃所有的触摸事件
我有一个UIScrollView
,我添加了一个轻击手势识别器来显示/隐藏一些UI覆盖使用:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; [scrollView addGestureRecognizer:singleTap];
和:
- (void)handleTap:(UITapGestureRecognizer *)sender { // report click to UI changer }
我在UIScrollView
的底部添加了一个简单的表格视图 。 一切工作正常(水平和垂直滚动),但问题是,只有手势识别器(上面),而不是简单的表视图识别轻敲。 如果我删除注册手势监听器的行,一切工作正常,表视图通知自己点击。
这就好像手势识别器function在桌面视图上“吃”了轻敲事件,并且不会向下传播它们。
任何帮助表示赞赏
这应该可以解决你的问题。
检测UIScrollView上的触摸事件和UIView的组件[放置在UIScrollView中]
这个想法是告诉手势识别器不要吞噬触摸事件。 为此,您需要将singleTap的cancelsTouchesInView
属性设置为NO
,默认为YES
。
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; singleTap.cancelsTouchesInView = NO; [scrollView addGestureRecognizer:singleTap];
Swift 3.0
let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) singleTap.cancelsTouchesInView = false singleTap.numberOfTapsRequired = 1 scrollView.addGestureRecognizer(singleTap)
而select器方法就像。
func handleTap(_ recognizer: UITapGestureRecognizer) { // Perform operation }
我认为原因是UIImageView的User Interaction Enabled
设置为false
。 您应该将其设置为true以启用点击
您可以设置哪些对象将被包含/排除触摸。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch { if (touch.view == [self view]) { return YES; } return NO; }
谢谢@ zambrey
Swift 2.2+版本:
scrollView.delegate = self let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed)) allowMultipleTouches.numberOfTapsRequired = 1 allowMultipleTouches.cancelsTouchesInView = false scrollView.addGestureRecognizer(allowMultipleTouches)
如果您的滚动视图在故事板中,请不要忘记在视图控制器中固定sockets。 在这个例子中, scrollView
是UIScrollView
的出口。
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
您可以在UIScrollView中捕捉任何types的手势。 确保你也处理一些默认属性,就像设置cancelsTouchesInView属性为false,默认情况下是true。 还给你的子视图一些标签号来区分select器。 也可以使他们的用户交互为真。
让tap = UITapGestureRecognizer(target:self,action:
select(didTapByUser(_ :)))
Swift 4.0
let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) singleTap.cancelsTouchesInView = false singleTap.numberOfTapsRequired = 1 scrollView.addGestureRecognizer(singleTap)
select方法:
@objc func handleTap(_ recognizer: UITapGestureRecognizer) { print("Tapped") }
不要忘记@objc
标签
这在Swift 3 / Xcode 8中适用于我
self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) self.scrollView.canCancelContentTouches = false
祝你好运!