45

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

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

和:

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

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

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

任何帮助表示赞赏

4

9 回答 9

82

这应该可以解决您的问题。
在 UIScrollView 和 UIView 的组件上检测触摸事件[放置在 UIScrollView 内]
这个想法是告诉手势识别器不要吞噬触摸事件。为此,您需要将 singleTap 的cancelsTouchesInView属性设置为NO,这是YES默认设置。

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTap]; 
于 2013-06-02T16:56:21.583 回答
15

斯威夫特 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
}
于 2017-04-06T07:31:02.107 回答
9

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

于 2016-05-20T00:21:34.117 回答
6

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {            
   if (touch.view == [self view]) {
       return YES;
   }
   return NO;
}
于 2013-06-02T17:42:40.070 回答
6

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

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
self.scrollView.canCancelContentTouches = false

祝你好运!

于 2017-07-26T20:49:54.353 回答
3

谢谢@zambrey

斯威夫特 2.2+ 版本:

scrollView.delegate = self

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

scrollView.addGestureRecognizer(allowMultipleTouches)

如果您的滚动视图位于 Storyboard 中,请不要忘记将 Outlet 固定在视图控制器中。在本例中,scrollView是 的插座UIScrollView

于 2016-07-28T11:15:23.093 回答
2

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
于 2017-01-12T16:30:11.417 回答
1

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

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

选择器(didTapByUser(_:)))

于 2017-05-01T18:12:02.540 回答
0

我的代码。

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

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
}


}
于 2020-10-01T08:50:08.900 回答