检测UIScrollView上的触摸事件和UIView的组件

我有我的简单的故事板iPad项目UIViewController包含UIScrollView放置在整个表面(1024 x 768)。 我已经创build了3个XIV文件,这些文件是我的应用程序在viewDidLoad中加载的UIViews,并将它们添加到UIScrollView中。 这3个XIB文件中的每一个都只包含一个UIButton。

这是层次结构:

〜UIViewController( UIViewControllerClass是这个UIViewController的类)

~~ UIScrollView(包含3个相同的UIViews)

UIView( UIViewClass是这个XIB文件的文件所有者)

~~~~ UIButton

我想我的UIViewControllerClass变得意识到两个:触摸UIScrollView组件上的任何地方,如果UIScrollView被触摸,如果UIScrollView中的UIView里面的UIButton被触摸,以确切的信息,该button被触摸。

我在UIViewClass里面创build了IBAction,以便在UIScrollView中的UIView里面使用UIButton,当我在所有元素(UIViewController,UIView和UIScrollView)上设置User Interaction Enabled = YES时,就像调用它一样。

但在这一点上,我的UIViewControllerClass不知道该触摸发生在该UIButton上的UIScrollView。 我做了这样的触摸识别器:

UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouch)]; touch.numberOfTouchesRequired = 1; 

并将其添加到UIScrollView组件。 通过这种方式,我能够在UIViewControllerClass中检测UIScrollView组件上的触摸事件,但是在UIScrollView中的UIView中触摸UIButton的事件处理程序不会再被调用。

所以,我需要在UIViewControllerClass中有这两个信息:

  • 触摸UIScrollView组件
  • 触摸在UIScrollView(如果这个button被触摸)的UIView中的UIButton

我想附加触摸事件识别器到整个UIScrollView组件是不是解决scheme,因为它禁用所有我写在UIViewClass中的触摸事件处理程序。

我认为解决scheme是以某种方式触及哪些在UIView里面的组件UIScrollView应该发送到UIViewControllerClass,但我没有find一种方法来做到这一点。

如果有人能帮助我,我会非常感激。 提前致谢。


[编辑#1:郑的回答]

点按手势必须将cancelsTouchesInView选项设置为NO

对于我上面的情况,这条线解决了一切:

 touch.cancelsTouchesInView = NO; 

非常感谢郑。

我不知道这是否适用于你,但我已经给出了关于在scrollview里面的视图触摸事件的答案:

在UIScrollView中closures键盘

这个想法是告诉scrollView不要吞噬滚动视图区域内的所有轻击手势。

我将在这里粘贴代码,希望它能解决你的问题:

 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; // prevents the scroll view from swallowing up the touch event of child buttons tapGesture.cancelsTouchesInView = NO; [pageScrollView addGestureRecognizer:tapGesture]; [tapGesture release]; ... // method to hide keyboard when user taps on a scrollview -(void)hideKeyboard { [myTextFieldInScrollView resignFirstResponder]; } 

你可以inheritance你的UIScrollView,并覆盖系统调用的方法- hitTest:withEvent:来确定哪个视图处理事件。 每当调用它时,都可以假定在滚动视图内发生触摸事件,通过调用超级实现,可以获得通常会处理事件的视图。

你可以在UIScrollView中捕捉任何一种手势。 确保你也处理一些默认属性,就像设置cancelsTouchesInView属性为false,默认情况下是true。 还给你的子视图一些标签号来区分select器。 也可以使他们的用户交互为真。

让tap = UITapGestureRecognizer(target:self,action:

select(didTapByUser(_ :)))