UIWebView,Zoom& elementFromPoint

时间:2013-01-15 03:20:08

标签: javascript ios objective-c events uiwebview

UIWebView中,当我longTap它时,我需要访问DOM元素的属性(来自SVG图)。为此,我添加了UILongPressGestureRecognizer如下:

UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action: @selector(longPress:)];
[self.webView addGestureRecognizer: longPress];

当我在视图上长按时,调用处理程序从中调用JS函数:

- (void) longPress: (UIGestureRecognizer *) gesture {
    CGPoint curCoords = [gesture locationInView:self.webView];

    if (!CGPointEqualToPoint(curCoords, self.lastLongPress)) {
        self.lastLongPress = curCoords;
        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"longPress(%f, %f)", curCoords.x, curCoords.y]];
    }
}

这是我的JS处理程序:

function longPress(x, y) {

    x = x + window.pageXOffset;
    y = y + window.pageYOffset;

    var element = svgDocument.elementFromPoint(x, y);                                                                                                                                                                                                                           
    alert(element.localName + ' ' + x + ' ' + y + ' ' + window.innerWidth + ' ' +  window.innerHeight);
}

然而,似乎UIWebView坐标是来自DOM坐标的!=(我点击的地方与警报中显示的localName不对应)。我已经设法找出UIWebView坐标和&之间存在+/- 1.4因子。 JS(通过点击屏幕的右下角并将这些值与window.innder{Width,Height}进行比较。

我的猜测是UIWebView最初可能会应用默认缩放比例,但我无法找到此值对应的内容。

此外,当用户实际缩放/移动页面时,我还需要一种方法来使其工作。

有人知道我做错了吗?

谢谢,

1 个答案:

答案 0 :(得分:3)

好的,我终于找到了问题所在。

它来自缩放比率,以下是我设法修复它的方法:

- (void) longPress: (UIGestureRecognizer *) gesture {
    int displayWidth = [[self.webView stringByEvaluatingJavaScriptFromString:@"window.innerWidth"] intValue];
    CGFloat scale = self.webView.frame.size.width / displayWidth;

    CGPoint curCoords = [gesture locationInView:self.webView];

    curCoords.x /= scale;
    curCoords.y /= scale;

    if (!CGPointEqualToPoint(curCoords, self.lastLongPress)) {
        self.lastLongPress = curCoords;

        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"longPress(%f, %f)", curCoords.x, curCoords.y]];
    }
}

JS Handler:

function longPress(x, y) {
    var e = svgDocument.elementFromPoint(x, y);

    alert('Youhouu ' + e.localName);
}

似乎不需要添加pageOffset,因为现在UIWebView会自动添加它(我相信iOS 5)。

干杯,