3

UIWebViewDOM 要素を longTap したときに (SVG グラフから) DOM 要素のプロパティにアクセスする必要があります。UILongPressGestureRecognizerそのために、次のように追加しました。

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

ビューを 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 に対応していません)。座標と JSの間に +/- 1.4 の係数があることがわかりましたUIWebView(画面の右下をクリックして、これらの値をwindow.innder{Width,Height}.

私の推測ではUIWebView、最初はデフォルトのズーム率が適用される可能性がありますが、この値が何に対応するのかわかりません。

さらに、ユーザーが実際にページをズーム/移動したときにこれを機能させる方法も必要です。

誰かが私が間違っていることを知っていますか?

ありがとう、

4

1 に答える 1

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 ハンドラー:

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

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

pageOffset がUIWebView自動的に追加されるようになったため、追加する必要はないようです (iOS 5 以降)。

乾杯、

于 2013-01-15T06:52:48.880 に答える