如何在UIWebView中获取触摸的(X,Y)坐标

时间:2013-08-13 13:41:16

标签: ios uiwebview

我有一个显示生成的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坐标被一些不同数量的像素关闭(随着缩放量和如何变化而变化)向上/向下或向左/向右滚动网页视图。

有没有办法确定网页视图的缩放比例和滚动位置,以便我可以相应地调整我的x和y坐标? UIScrollView中的zoomScalecontentOffset属性似乎未在UIWebView中公开。

2 个答案:

答案 0 :(得分:2)

使用UIGestureRecognizerDelegate方法:

在声明文件中添加UIGestureRecognizerDelegate(即您的.h文件)

步骤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
}

答案 1 :(得分:1)

编辑:在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对象,但它确实解决了我的问题。我的应用程序无论如何都是在Enterprise许可下发布的,因此应用程序商店提交对我来说不是一个问题。