gpt4 book ai didi

ios - 如何只响应单击手势,同时让后面的对象响应双击?

转载 作者:可可西里 更新时间:2023-11-01 03:38:49 30 4
gpt4 key购买 nike

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

我首先将热点设置为带有操作的透明 UIButton,但双击热点导致热点操作被调用两次。所以我从按钮中删除了 Action 并附加了一个单击手势:

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 ,但没有值的组合阻止单击手势消耗双击手势。

顺便说一句,在我的 View 层次结构中,热点和 UIWebView 之间的关系是“表亲”关系——它们是两个同级 View 的 subview 。如果我将手势识别器添加到热点 View 、Web View 或它们的“祖 parent ” View ,我会得到相同的结果。

最佳答案

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

1) 我必须将手势添加到 UIWebView 的父 View 。不匹配的事件不会像我想象的那样在 View 中逐层穿过重叠对象。相反,它们遍历从 subview 到父 View 的层次结构。因此,只要我将双击手势添加到 UIWebView 的同级或“表兄弟” View ,它就永远不会继续到 Web View 。这意味着我无法使用在 Interface Builder 中布置的按钮或 View 来确定多个热点区域。相反,我必须将所有单击事件重定向到一个方法,然后查看触摸位置以确定触发什么操作。

2) 我必须将 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 方法添加到我的 View Controller (我的手势的委托(delegate))并返回 YES。这允许我的单击手势响应,即使我在 UIWebView 中显示 HTML、文本或图像内容,UIWebView 为这些内容类型实现了自己的手势。这部分是从this answer学来的.

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

  • 单击 WebView :我在 WebView 的父 View 上的单击手势响应;如果适用,Web View 的单击手势也会响应,因为同时手势已启用

  • 双击 WebView :我在 WebView 的父 View 上的双击手势响应(但不执行任何操作);我的单击手势没有响应,因为它被配置为仅在双击失败时响应; Web View 的双击事件也会响应,因为它是 View 层次结构的一部分(似乎 Web View 的双击功能不使用手势,否则在我的原始设置中它会优先于我自己的手势)

有了这个解释,这里有一些工作代码:

- (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;
}

关于ios - 如何只响应单击手势,同时让后面的对象响应双击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11514276/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com