我在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没有响应转发的事件。这是可以预料的,因为Event Handling Guide for iOS表示我们只能将事件转发给UIView的自定义子类,而不是UIKit框架对象。
有没有办法阻止我的单击手势响应双击不会转移双击事件?这似乎是一个基本要求,但我看不到一个简单的方法来做到这一点。我阅读并试用了UIGestureRecognizer的touch delivery properties,但没有任何值的组合可以阻止单击手势消耗双击手势。
顺便说一下,我的视图层次结构中的热点和UIWebView之间的关系是“堂兄弟” - 它们是两个兄弟视图的子视图。如果我将手势识别器添加到热点视图,网络视图或他们的“祖父母”视图,我会得到相同的结果。
不知道这(因此它是一个注释),但你不能添加一个水龙头手势UIWebView? – 2012-07-17 00:01:20
@DeanPucsek我这样做了一段时间,它显示PDF文档时工作。但是,如果UIWebView中显示的内容是HTML或JPG,则UIWebView将捕获其自身操作的单击,并且UIGestureRecognizer不会收到该事件。用热点视图处理这个会更方便,但是如果我可以使它适用于所有的UIWebView内容类型,我可以回到这种方法。 – arlomedia 2012-07-17 04:28:27