UILongPressGestureRecognizer如何工作

时间:2014-05-06 04:43:11

标签: ios uigesturerecognizer

我试图了解手势识别器的工作原理,并尝试让手势识别器告诉我何时长时间触摸BEGINS以及即使触摸不动也会结束。

viewDidLoad中,我添加了一个名为game的子视图。 在游戏中,我已经实现了两种识别触摸的方法。一个有效,但没有做我想要的。另一个不起作用。

Method1 我刚添加了两种方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Began");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *) event {
    NSLog(@"Ended");
}

这没有实例化手势识别器。有人可以告诉我为什么吗?

这个问题是- (void)touchedEnded:只有在触摸移动时才会被调用,而如果触摸在它开始的同一位置结束则不会被调用。因此,如果我触摸并移动并放开,则会调用这两个函数。如果我触摸并按住并放开(不移动),则仅调用- (void)touchesBegan

方法2 我实例化了一个手势识别器:

@property (nonatomic, strong) UILongPressGestureRecognizer *lprg;

然后在我的设置中:

self.lprg = [UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];

然后:

- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer {
    NSLog(@"Handling");
    switch (recognizer.state) {
     case UIGestureRecognizerStateBegan:
         // ...
    }
}

但是这个我以编程方式实例化识别器的方法并不起作用。我从未在控制台中获得任何NSLog输出。

2 个答案:

答案 0 :(得分:4)

UIResponder的所有子类(UIView都是)对touchesBegan做出回应,这就是为什么你不必做任何事情而你是免费获得的。然而,它远非手势识别器。在高级别的手势识别器跟踪很多事情,例如状态。当然你可以开始使用触摸,但想象一下,如果用三指长按,滑动或捏一下就可以了。事情变得很难看。安装手势识别器可以简化操作。

例如长按:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] init];
longPress.numberOfTouchesRequired = 3;
[longPress addTarget:self action:@selector(longPressDetected:)];
[self.view addGestureRecognizer:longPress];

修改

实现委托:

在您的实现文件(.m)中添加@implemation行末尾的行。它应该看起来像

 @implementation ViewController <UIGestureRecognizerDelegate>

然后在分配并初始化手势识别器后,将代理设置如下

 longPress.delegate = self;

然后从https://developer.apple.com/library/ios/documentation/uikit/reference/UILongPressGestureRecognizer_Class/Reference/Reference.html实现所需数量的方法。例如,你可能会考虑这两个

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return YES;
}

答案 1 :(得分:1)

您必须使用此代码初始化手势

  UILongPressGestureRecognizer *gesture1 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(celllongpressed:)];
    [gesture1 setDelegate:self];
    [gesture1 setMinimumPressDuration:1];
    [self addGestureRecognizer:gesture1];

和目标方法使用此

-(void)celllongpressed:(UIGestureRecognizer *)longPress
{
}