子视图中的手势识别器出现问题

Posted

技术标签:

【中文标题】子视图中的手势识别器出现问题【英文标题】:Trouble with gesture recognizers in subviews 【发布时间】:2012-04-23 19:28:09 【问题描述】:

我遇到了一个相当基本的问题,我环顾四周(这里,谷歌等)并没有找到解决方案:

在我的视图控制器的viewDidLoad 中,我有这个:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(myfunc:)];

//I have a UIScrollView named "containerView"
//here's some code that creates an UIView in a variable named "myView"

//this works fine, I can see "myView" when I run it
[containerView addSubview:myView];

[myView addGestureRecognizer:longPress];

然后我在同一个类中有这个函数:

- (void)myfunc:(UIRotationGestureRecognizer *)recognizer 

    NSLog(@"hola!"); //never runs

NSLog 的调用永远不会运行。我做错了什么?

编辑

一些额外的信息:似乎没有触摸事件被发送到子视图。但是,我尝试在 UIScrollView 中添加一个带有按钮的 UIView,所有这些都在 UIScrollView 中,并且按钮接收到触摸事件就好了,所以问题仅在于以编程方式添加的子视图。

【问题讨论】:

你试过长按屏幕吗? 这就是这一切的重点,不是吗.. 我想是的 :) 只是到处乱逛^^无论如何,您的代码看起来很完美。 也许您可以 1. 在将 YourView 添加为子视图之前添加识别器; 2. 将它专门插入到任何其他视图的顶部,这样其他视图就不能拦截它的触摸事件。 我试过#1,没有运气。但是,我尝试在视图中添加一个圆形矩形按钮,但它似乎没有响应触摸......知道为什么会发生这种情况吗? 【参考方案1】:

奇怪的是,在 UIScrollView 中添加了一个“容器”UIView,然后在这个容器中添加了其他子视图,使其工作。现在触摸事件被发送到子视图。

【讨论】:

【参考方案2】:

How can a superview interecept a touch sequence before any of its subviews?

TLDR:

[containerView setCanCancelContentTouches:NO]; 

就像将手势识别器添加到滚动视图一样。

也看看

[containerView setDelaysContentTouches:NO];

如果上述行为不完全正确。

更多信息: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIScrollView_Class/Reference/UIScrollView.html

【讨论】:

我玩过这些属性,它们没有帮助。看看我对问题的编辑,我在界面编辑器上手动添加了一个子视图,它接收触摸事件,但不是我以编程方式添加的子视图...【参考方案3】:

我认为在 myFunc 上你必须这样做:

switch (reconiger.state)

    case UIGestureRecognizerBegin:
      //Do something when start recognizer
      break;
    case UIGestureRecognizerEnd:
      //Do something when end recognizer
      break;

【讨论】:

以上是关于子视图中的手势识别器出现问题的主要内容,如果未能解决你的问题,请参考以下文章

ios 滑动手势在子视图上未被识别,父视图上的手势

缩放时,UIScrollview 子视图无法识别手势

UIScrollview 子视图在缩放后无法识别平移手势

我对响应不正确子视图的手势识别器有疑问,有啥问题?

如何将手势识别器添加到一系列子视图中?

具有 UIView 作为子视图的 UICollectionView 的选择性手势识别