【问题标题】:Multiple UITapGestureRecognizer not working on UIScrollView多个 UITapGestureRecognizer 在 UIScrollView 上不起作用
【发布时间】:2019-09-17 17:56:29
【问题描述】:

我想在UIScrollView 上添加多个UITapGestureRecognizer,但它只能识别一个手势。
我想为触摸开始添加第一个手势,为触摸结束事件添加第二个手势。

以下是我的代码:-

self.tapStartGesture = [[UITapGestureRecognizer alloc] initWithTarget:self  action:@selector(tapGesture:)];
self.tapStartGesture.numberOfTapsRequired = 1;
self.tapStartGesture.numberOfTouchesRequired = 1;
[self.tapStartGesture setState:UIGestureRecognizerStateBegan];
[self.scrollView addGestureRecognizer:self.tapStartGesture];

self.tapEndGesture = [[UITapGestureRecognizer alloc] initWithTarget:self  action:@selector(tapGesture:)];
self.tapEndGesture.numberOfTapsRequired = 1;
self.tapEndGesture.numberOfTouchesRequired = 1;
[self.scrollView addGestureRecognizer:self.tapEndGesture];

- (void)tapGesture:(UITapGestureRecognizer *)sender {
    if(sender==self.tapStartGesture) {
        NSLog(@"tapStartGesture");
    } else if(sender==self.tapEndGesture) {
        NSLog(@"tapEndGesture");
    }
}

【问题讨论】:

    标签: ios objective-c uiscrollview gesture uitapgesturerecognizer


    【解决方案1】:

    点击手势只有一种状态——“结束”。您无法检测何时开始使用点击手势进行点击。如您所见,尝试使用两个轻击手势并不能达到您想要的效果。

    你需要实现UIResponder方法touchesBegantouchesEnded

    您可能还想查看UITapGestureRecognizer - make it work on touch down, not touch up?

    【讨论】:

    • 每次识别tapEndGesture。 tapStartGesture 没有调用
    • 哦,对了。点击手势只有一种状态。如果最终被识别为实际的点击,这只是一个点击手势。您无法获得点击手势的“开始”状态。如果您想知道用户何时触摸屏幕以及何时停止触摸屏幕,请考虑覆盖 UIResponder 中的 touchesBegantouchesEnded 方法。
    【解决方案2】:

    通过实现自定义手势解决的问题。

    文件:-MyGesture.h

    #import <UIKit/UIKit.h>
    @interface MyGesture : UIGestureRecognizer
    @end
    

    文件:-MyGesture.m

    #import "MyGesture.h"
    @implementation MyGesture    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        if (self.state == UIGestureRecognizerStatePossible) {;
            self.state = UIGestureRecognizerStateBegan;
        }
    }
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
        self.state = UIGestureRecognizerStateEnded;
    }    
    @end
    

    使用方法:-

    MyGesture *gesture = [[MyGesture alloc] initWithTarget:self action:@selector(myGesture:)];
    [self.scrollView addGestureRecognizer:gesture];
    
    - (void)myGesture:(MyGesture *)sender {
        if (sender.state == UIGestureRecognizerStateBegan) {
            NSLog(@"tapStartGesture");
        } else if (sender.state == UIGestureRecognizerStateEnded) {
            NSLog(@"tapEndGesture");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多