在 iOS 7 中操作手势识别器

Posted

技术标签:

【中文标题】在 iOS 7 中操作手势识别器【英文标题】:Manipulating Gesture Recognizers in iOS 7 【发布时间】:2014-01-14 09:03:33 【问题描述】:

我有一个用计算器制作的手势识别器。它与用户双击时激活的操作相关联。我将手势识别器连接到视图控制器的主视图,但是手势识别器也应用于我的按钮。因此,如果用户快速键入 11,他们会快速按两次 1 并意外激活他们不想要的功能。如何使 UIGestureRecognizer 不对按钮起作用?我想保持双击手势。我不想将其更改为两指轻敲或类似的奇怪东西。但是,如果没有其他方法(我怀疑有),我可以这样做。

【问题讨论】:

【参考方案1】:

试试这个:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

    if ((touch.view == yourButton)) 
        return NO;
    

    return YES;

每次识别手势时都会调用它,如果视图是您的按钮,它将忽略手势。

【讨论】:

【参考方案2】:

你应该在你的 ViewController.h 中采用 UIGestureRegconizerDelegate 协议

@interface ViewController : UIViewController <UIGestureRecognizerDelegate>

@end

在你的 ViewController.m 中,实现这个方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

    if ([touch.view isKindOfClass:[UIControl class]])
        return NO;
    
    return YES;

yourGestureRecognizer.delegate = self //your view controller.

【讨论】:

【参考方案3】:

基于 Antonio 的回答,您可以提供所有 tags 以使这更容易。据推测,您的计算器不止一个yourButton。假设所有按钮的标签都大于 100:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
     shouldReceiveTouch:(UITouch *)touch 

    if ((touch.view.tag > 100)) 
        return NO;
    
    return YES;

这比检查view 的类更干净。您现在可以控制允许识别手势的位置。

【讨论】:

以上是关于在 iOS 7 中操作手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 - 透明的 UIView 阻塞手势识别器

iOS 7 iPad:UIPageViewController 中的 UITableView 滑动删除(手势识别器冲突)

iOS开发系列--触摸事件手势识别摇晃事件耳机线控

ios手势识别之轻扫

iOS开发系列--触摸事件手势识别摇晃事件耳机线控

ios手势识别之旋转+缩放