子视图中的手势识别器出现问题
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;
【讨论】:
以上是关于子视图中的手势识别器出现问题的主要内容,如果未能解决你的问题,请参考以下文章