- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 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/
我正在尝试检查 Entry 中是否存在重复项,并使用内联消息提醒用户该数字存在。 $(document).ready(function(){ $("#con1").blur(function(
我有一个基于类的 View 。我在引导模式上使用 Ajax。为了避免页面刷新,我想使用此类基于 View 返回 JSON 响应而不是 HTTP 响应,但我只看到了如何为基于函数的 View 返回 JS
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个大型内部企业基于 Web 的应用程序在 IIS6 上运行 ASP.NET 3.5,生成 401 个“未经授权”响应,然后是 200 个“Ok”响应(如 Fiddler 所述)。我知道为什么会发
感谢您研究我的问题。 我有一个node/express服务器,配置了一个server.js文件,它调用urls.js,而urls.js又调用 Controller 来处理http请求,所有这些都配置相
当我使用以下命令时,我得到正确的 JSON 响应: $ curl --data "regno=&dob=&mobile=" https://vitacademics-rel.herokuapp.co
我有一个非常简单的 RESTful 服务,它通过 POST 接收一些表单数据,其目的是在云存储(Amazon S3、Azure Blob 存储等)中简单地保留文本主体(具有唯一 ID)作为一个文件..
UDP 不发送任何 ack,但它会发送任何响应吗? 我已经设置了客户端服务器UDP程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗? 我的假设是; 客户端 --> 广播服务器地
我有一个电梯项目,其中 有一个扩展 RestHelper 的类,看起来像这样 serve{ "api" / "mystuff" prefix { case a
我们正在寻求覆盖 Kong 错误响应结构并编写自定义消息(即用我们的自定义消息替换“超出 API 速率限制”、“无效的身份验证凭据”等)。 我们要找的错误响应结构(代码是自定义的内部错误代码,与HTT
我正在尝试监听 EKEventStoreChangedNotification 以检查当我的应用程序处于后台时日历是否已更改。 我在 View Controller 的 initWithNibMeth
我了解 javascript,并且正在学习 ASP.NET C# 我想要做什么(完成的是javascript): document.getElementById('divID-1'
是否可以过滤所有 har 对象并仅获取 POST 请求/响应?也许在初始化 BrowserMobProxyServer 期间是这样做的方法?我需要将 har 对象保存到文件中并上传到 har 查看器。
我正在尝试向 Oauth 的 API 发送响应。遗憾的是,Symfony2 文档在解释 $response->headers->set(...); 的所有不同部分方面做得很差。 这是我的 OauthC
我正在尝试测试用例来模拟 api 调用,并使用 python 响应来模拟 api 调用。 下面是我的模拟, with responses.RequestsMock() as rsps: url
在尝试在 Haskell 中进行一些领域驱动设计时,我发现自己遇到了这个问题: data FetchAccessories = FetchAccessories data AccessoriesRes
我正在与 ANT+ USB 棒连接,并用项目 react 器替换我自己天真的“MessageBus”,因为它看起来非常合适。 USB接口(interface)本质上是异步的(单独的输入/输出管道),我
我正在将项目迁移到AFNetworking 2.0。使用AFNetworking 1.0时,我编写了代码来记录控制台中的每个请求/响应。这是代码: -(AFHTTPRequestOperation *
我有以下代码段。 ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){
我有问题......我在 php 中有一个监听器脚本可以执行以下操作: if ($count != 1) {echo 'no';} else { echo "yes";} 因此它会回显"is"或“
我是一名优秀的程序员,十分优秀!