识别不在某个子视图中的手势
我想使用 UIGestureRecognizers 来区分两种手势:发生在迷你 UIView 中的手势和发生在视图中其他任何位置的手势。
我认为我可以使用 requireGestureRecognizerToFail 通过两个 GestureRecognizer 来完成此任务。但是,父视图的 GestureRecognizer 永远不会触发。这是为什么呢?
下面是一个演示性测试用例:
-(void)viewDidLoad {
UIView *miniView = [[[UIView alloc] initWithFrame:CGRectMake(100,100,20,20)] autorelease];
miniView.backgroundColor = [UIColor redColor];
[self.view addSubview:miniView];
// triggered when you tap the miniView
UITapGestureRecognizer *miniTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(miniTap:)] autorelease];
[miniView addGestureRecognizer:miniTap];
// expected: triggered when you tap anywhere outside the mini-view
// actual: never triggered!
UITapGestureRecognizer *nonMiniTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(nonMiniTap:)] autorelease];
[nonMiniTap requireGestureRecognizerToFail:miniTap];
[self.view addGestureRecognizer:nonMiniTap];
[super viewDidLoad];
}
-(void)miniTap:(id)sender { NSLog(@"miniTap"); }
-(void)nonMiniTap:(id)sender { NSLog(@"nonMiniTap"); }
Why does requireGestureRecognizerToFail: Prevent nonMiniTap from being触发?我可以让它按照预期的方式运行吗?
I would like to use UIGestureRecognizers to distinguish between two kinds of gestures: those occurring in a mini-UIView and those occurring anywhere else in the view.
I thought I could accomplish this with two GestureRecognizers using requireGestureRecognizerToFail. However, the parent view's GestureRecognizer never fires. Why is this?
Here is a demonstrative test case:
-(void)viewDidLoad {
UIView *miniView = [[[UIView alloc] initWithFrame:CGRectMake(100,100,20,20)] autorelease];
miniView.backgroundColor = [UIColor redColor];
[self.view addSubview:miniView];
// triggered when you tap the miniView
UITapGestureRecognizer *miniTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(miniTap:)] autorelease];
[miniView addGestureRecognizer:miniTap];
// expected: triggered when you tap anywhere outside the mini-view
// actual: never triggered!
UITapGestureRecognizer *nonMiniTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(nonMiniTap:)] autorelease];
[nonMiniTap requireGestureRecognizerToFail:miniTap];
[self.view addGestureRecognizer:nonMiniTap];
[super viewDidLoad];
}
-(void)miniTap:(id)sender { NSLog(@"miniTap"); }
-(void)nonMiniTap:(id)sender { NSLog(@"nonMiniTap"); }
Why does requireGestureRecognizerToFail: prevent nonMiniTap from ever being triggered? Can I make it behave in the expected way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您看到
requireGestureRecognizerToFail 的文档:
,明确指出手势的状态不会从UIGestureRecognizerStatePossible
直到另一个手势转换为UIGestureRecognizerStateFailed
或UIGestureRecognizerStateRecognized
。但由于miniTap
手势不会移出其默认的UIGestureRecognizerStatePossible
状态,因为触摸不在其视图内,因此nonMiniTap
手势没认出来。因此,您对父视图的点击失败了。因此不需要依赖。你可以把那条线取下来,它应该按照你想要的方式工作。
If you see the documentation for
requireGestureRecognizerToFail:
, it is stated clearly that the gesture's state isn't changed fromUIGestureRecognizerStatePossible
until the other gesture transitions toUIGestureRecognizerStateFailed
orUIGestureRecognizerStateRecognized
. But since theminiTap
gesture doesn't move out of its defaultUIGestureRecognizerStatePossible
state as the touch isn't within its view, thenonMiniTap
gesture isn't recognized. So your taps on the parent view are failing.As such that dependency isn't required. You can take that line off and it should work as you want it to.