如何在 UIWebView 中获取(X,Y)触摸坐标
Posted
技术标签:
【中文标题】如何在 UIWebView 中获取(X,Y)触摸坐标【英文标题】:How to get (X,Y) coordinate of touch in UIWebView 【发布时间】:2013-08-13 13:41:15 【问题描述】:我有一个显示生成的 html 表的 UIWebView。当用户点击 html 表格中的单元格时,我的应用需要知道他们点击了哪个单元格,以及点击位置的 (x,y) 坐标,以便在该点显示一个弹出框。
我已经在我的 UIWebView 委托中实现了 shouldStartLoadWithRequest。在我的网页中,我嵌入了 javascript 代码,用于捕获触摸事件并在 URL 请求中传递触摸点的 (x,y) 坐标,如下所示:
var x, y;
function init()
// Add an event listener for touch events - set x and y to the coordinate of the touch point
document.addEventListener('touchstart', function(event)
x = event.touches[0].clientX;
y = event.touches[0].clientY;
, false);
function cellTapped(event)
window.location.href="file://myapp/dostuff?x=" + x + "&y=" + y;
在我的 html 表格中,每个单元格都会收到一个调用 cellTapped() 的 onclick 事件:
<td onclick="cellTapped(event)">...</td>
因此,每当用户触摸 UIWebView 中的任何位置时,我都会获得触摸点的坐标,并将其保存在 x 和 y 中。如果他们在其中一个表格单元格内触摸,我会收到触摸事件(设置 x 和 y),然后调用 cellTapped() 并设置 window.location.href,将 (x,y) 坐标传递到我的应用程序中。
这一切都很好。除非用户缩放或滚动了 UIWebView。当他们缩放或滚动时,我从 event.touches[0].clientX 和 event.touches[0].clientY 获得的 x 和 y 坐标偏离了一些不同数量的像素(随缩放量和方式而变化) Web 视图向上/向下或向左/向右滚动)。
有没有办法确定网页视图的缩放比例和滚动位置,以便我可以相应地调整我的 x 和 y 坐标? UIScrollView 中的 zoomScale
和 contentOffset
属性似乎没有在 UIWebView 中公开。
【问题讨论】:
看看:How to detect zoom scale of UIWebView和How can I get the current zoom level in a UIScrollView? 【参考方案1】:使用 UIGestureRecognizerDelegate 方法:
在声明文件(即您的 .h 文件)中添加 UIGestureRecognizerDelegate
第1步:只需设置gestureRecognizer的委托:(在.m文件中)
UITapGestureRecognizer *webViewTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
webViewTapped.numberOfTapsRequired = 1;
webViewTapped.delegate = self;
[webView addGestureRecognizer:webViewTapped];
[webViewTapped release];
第 2 步:覆盖此函数:(在 .m 文件中)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
return YES;
第 3 步:现在实现 tapAction 函数:
- (void)tapAction:(UITapGestureRecognizer *)sender
CGPoint point = [sender locationInView:self.view]; // get x and y from here
【讨论】:
我认为你不能在 UIWebView 上做到这一点,因为 Web 视图会在手势识别器看到之前拦截点击。 试过了。 tapAction 永远不会被调用,因为 UIWebView 拦截了点击并且不传播它。【参考方案2】:编辑:在 ios 5 及更高版本中,UIWebView 的 scrollView 属性是公开且可访问的,因此这不是问题。就我而言,我仍然需要支持运行 iOS 4 的设备(信不信由你...),因此以下解决了旧版本的问题。
通过循环遍历我的UIWebView
的子视图,我可以找到底层的UIScrollView
,然后使用它的zoomScale
和contentOffset
属性来查找缩放和滚动位置:
for (UIView *view in myWebView.subviews)
if ([view isKindOfClass:[UIScrollView class]])
// Get UIScrollView object
scrollview = (UIScrollView *) view;
// Find the zoom and scroll offsets
float zoom = scrollView.zoomScale;
float xOffset = scrollView.contentOffset.x;
float yOffset = scrollView.contentOffset.y;
我不知道 Apple 是否会批准此应用商店提交,因为我认为他们有理由不公开底层 UIScrollView
对象,但它确实解决了我的问题。无论如何,我的应用是根据企业许可证分发的,所以应用商店提交对我来说不是问题。
【讨论】:
-[UIWebView scrollView]
属性不是您想要的吗? developer.apple.com/library/ios/documentation/uikit/reference/…
@axiixc:我仍然需要支持运行 iOS 4 的设备(我知道,我知道...),并且 scrollView 属性仅适用于 iOS 5 及更高版本。我进行了编辑以澄清这一点。以上是关于如何在 UIWebView 中获取(X,Y)触摸坐标的主要内容,如果未能解决你的问题,请参考以下文章
请教大神 在touchmoved方法中如何获取移动时x y相对触摸点移动了多