Ios 如何只对一次轻拍动作做出反应,而让后面的物体对两次轻拍做出反应?

Ios 如何只对一次轻拍动作做出反应,而让后面的物体对两次轻拍做出反应?,ios,uiwebview,uikit,uigesturerecognizer,ios5,Ios,Uiwebview,Uikit,Uigesturerecognizer,Ios5,我正在UIWebView中显示文档。我想在文档上放置一个热点,以在点击时触发一个操作,但我还想保持默认的UIWebView行为,即双击时自动缩放文档。我不知道如何在让UIWebView响应双点击的同时响应单点击 我首先将热点设置为带有操作的透明UIButton,但是双击热点会导致热点操作被调用两次。因此,我从按钮上删除了该动作,并附加了一个点击手势: UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initW

我正在UIWebView中显示文档。我想在文档上放置一个热点,以在点击时触发一个操作,但我还想保持默认的UIWebView行为,即双击时自动缩放文档。我不知道如何在让UIWebView响应双点击的同时响应单点击

我首先将热点设置为带有操作的透明UIButton,但是双击热点会导致热点操作被调用两次。因此,我从按钮上删除了该动作,并附加了一个点击手势:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
这与正常的按钮操作相同。但随后我创建了一个双击手势,并将其配置为使用RequireTestureRecognitizerToFail阻止单次点击手势:

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(zoomWebView:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[self.hotspot addGestureRecognizer:doubleTap];
[doubleTap release];

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
[singleTap requireGestureRecognizerToFail:doubleTap];
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];

- (void)zoomWebView:(UITapGestureRecognizer *)gesture {
    NSLog(@"double tap");
}
使用此设置,在热点上单击一次调用singleTapAction,在热点上双击一次调用zoomWebView(自定义方法)。这是好的,因为singleTapAction不再被调用两次,但坏的是,UIWebView不再响应双击

我尝试将双击事件从双击手势转发到UIWebView,方法是将UIApgestureRecognizer子类化,覆盖ToucheSBegind和touchesEnded方法,并将它们的参数发送到UIWebView的相应方法。当我这样做时,我可以看到我的子类正在接收事件,但是UIWebView没有响应转发的事件。这是意料之中的,因为声明我们只能将事件转发到UIView的自定义子类,而不能转发到UIKit框架对象

有没有一种方法可以防止我的单点手势对不转移双点事件的双点做出响应?这似乎是一个基本要求,但我看不到一个简单的方法来做到这一点。我阅读了UIGestureRecognizer的文章并进行了实验,但没有任何值的组合阻止单点击手势使用双点击手势


顺便说一下,在我的视图层次结构中,hotspot和UIWebView之间的关系是“近亲”关系——它们是两个同级视图的子视图。如果我将手势识别器添加到热点视图、web视图或它们的“祖父母”视图,我会得到相同的结果。

自从事件处理开始以来,鼠标单击一直是个问题

任何软件都不可能在一次单击的情况下确定双击即将发生

所以,如果你想处理单点和双击,你必须做你自己的双击处理

对单击实例计时,并生成自己的双击事件


希望能在您的上下文中转换为点击。

好的,我从两个部分找到了解决方案:

1) 我必须将我的手势添加到UIWebView的父视图中。不匹配的事件不会像我想象的那样在视图中从一层到另一层穿过重叠的对象。相反,它们在视图的层次结构中从一个子视图传递到父视图。因此,只要我将双击手势添加到UIWebView的兄弟或“兄弟”视图中,它就永远不会进入web视图。这意味着我不能使用Interface Builder中的按钮或视图来确定多个热点区域。相反,我必须将所有单触事件重定向到一个方法,然后查看触摸位置以确定要触发的操作

2) 我必须向我的视图控制器(手势的代理)添加GestureRecognitor:shouldRecognitizewithGestureRecognitor:method,并返回YES。这使得我的单点击手势即使在UIWebView中显示HTML、文本或图像内容时也能做出响应,UIWebView为这些内容类型实现了自己的手势。这部分我是从学校学来的

通过这些更改,我了解事件的层次结构:

  • 单点web视图:我在web视图的父视图上的单点手势响应;如果适用,web视图的单点击手势也会响应,因为同时手势已启用

  • 双击web视图:我在web视图的父视图上的双击手势做出响应(但不做任何事情);我的单点击手势没有响应,因为它被配置为仅在双点击失败时响应;web视图的双击事件也会响应,因为它是视图层次结构的一部分(web视图的双击功能似乎不使用手势,因为在我的原始设置中,它将优先于我自己的手势)

有了这个解释,下面是一些工作代码:

- (void)viewDidLoad {
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapWebView:)];
    doubleTap.numberOfTapsRequired = 2;
    doubleTap.delegate = self;
    [self.webViewParent addGestureRecognizer:doubleTap];
    [doubleTap release];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapWebView:)];
    singleTap.numberOfTapsRequired = 1;
    [singleTap requireGestureRecognizerToFail:doubleTap];
    singleTap.delegate = self;
    [self.webViewParent addGestureRecognizer:singleTap];
    [singleTap release];
}

- (void)doubleTapWebView:(UITapGestureRecognizer *)gesture {
    NSLog(@"double-tap");
    // nothing to do here
}

- (void)singleTapWebView:(UITapGestureRecognizer *)gesture {
    NSLog(@"single-tap");
    CGPoint touchLocation = [gesture locationInView:self.webViewParent];
    float x = touchLocation.x;
    float y = touchLocation.y;
    CGRect frame = self.webViewParent.frame;
    if (y < frame.size.height * .33) {
        NSLog(@"top");
    } else if (y > frame.size.height * .67) {
        NSLog(@"bottom");
    } else if (x < frame.size.width * .33) {
        NSLog(@"left");
    } else if (x > frame.size.width * .67) {
        NSLog(@"right");
    } else {
        NSLog(@"center");
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
-(void)viewDidLoad{
UITapGestureRecognizer*doubleTap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(doubleTapWebView:)];
doubleTap.numberOfTapsRequired=2;
doubleTap.delegate=self;
[self.webViewParent addgestureRecognitor:双击];
[双击释放];
UITapGestureRecognizer*singleTap=[[UITapGestureRecognizer alloc]initWithTarget:self-action:@selector(singleTapWebView:)];
singleTap.numberOfTapsRequired=1;
[单点击要求检测识别邮件:双点击];
singleTap.delegate=self;
[self.webViewParent addgestureRecognitor:singleTap];
[单点释放];
}
-(无效)doubleTapWebView:(UITapgestureRecognitizer*)手势{
NSLog(“双击”);
//这里没什么可做的
}
-(无效)singleTapWebView:(UITapgestureRecognitizer*)手势{
NSLog(“单抽头”);
CGPoint touchLocation=[手势位置视图:self.webViewParent];
float x=touchLocation.x;
浮动y=触摸位置。y;
CGRect frame=self.webViewParent.frame;
如果(yframe.size.height*.67){
NSLog(@“底部”);
}否则如果(xframe.size.width*.67){