识别不在某个子视图中的手势

发布于 2024-11-16 02:56:45 字数 1253 浏览 4 评论 0原文

我想使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

度的依靠╰つ 2024-11-23 02:56:45

如果您看到 requireGestureRecognizerToFail 的文档:,明确指出手势的状态不会从UIGestureRecognizerStatePossible 直到另一个手势转换为 UIGestureRecognizerStateFailedUIGestureRecognizerStateRecognized。但由于 miniTap 手势不会移出其默认的 UIGestureRecognizerStatePossible 状态,因为触摸不在其视图内,因此 nonMiniTap 手势没认出来。因此,您对父视图的点击失败了。

因此不需要依赖。你可以把那条线取下来,它应该按照你想要的方式工作。

If you see the documentation for requireGestureRecognizerToFail:, it is stated clearly that the gesture's state isn't changed from UIGestureRecognizerStatePossible until the other gesture transitions to UIGestureRecognizerStateFailed or UIGestureRecognizerStateRecognized. But since the miniTap gesture doesn't move out of its default UIGestureRecognizerStatePossible state as the touch isn't within its view, the nonMiniTap 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文