我在 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];
这与正常的按钮操作相同。但后来我创建了一个双击手势,并将其配置为使用 requireGestureRecognizerToFail 阻止单击手势:
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 不再响应双击。
我尝试通过继承 UITapGestureRecognizer、覆盖 touchesBegan 和 touchesEnded 方法并将它们的参数发送到 UIWebView 的相应方法,将双击事件从我的 doubleTap 手势转发到 UIWebView。当我这样做时,我可以看到我的子类正在接收事件,但 UIWebView 没有响应转发的事件。这是意料之中的,因为iOS 的事件处理指南说我们只能将事件转发到 UIView 的自定义子类,而不是 UIKit 框架对象。
有没有办法阻止我的单击手势响应不会转移双击事件的双击?这似乎是一个基本要求,但我看不到一个直接的方法来做到这一点。我阅读并尝试了 UIGestureRecognizer 的触摸传递属性,但没有任何值组合阻止单击手势消耗双击手势。
顺便说一句,我的视图层次结构中的热点和 UIWebView 之间的关系是“表亲”的关系——它们是两个兄弟视图的子视图。如果我将手势识别器添加到热点视图、Web 视图或它们的“祖父母”视图,我会得到相同的结果。