在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
最初可能会应用默认缩放比例,但我无法找到此值对应的内容。
此外,当用户实际缩放/移动页面时,我还需要一种方法来使其工作。
有人知道我做错了吗?
谢谢,
答案 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)。
干杯,