如何在 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 中的 zoomScalecontentOffset 属性似乎没有在 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,然后使用它的zoomScalecontentOffset 属性来查找缩放和滚动位置:

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相对触摸点移动了多

电阻触摸屏硬件原理

电阻触摸屏硬件原理

在Carto移动SDK中获取触摸的MapTile的x和y像素

如何控制 UIWebView 上的触摸? (苹果手机)

【Matlab】获取鼠标坐标值ginput()函数