7

UIWebViewがロードされたhtml文字列にURLリンクが含まれています。URLリンクをクリックすると、内部の自家製ブラウザが起動してそのリンクが開きます。

UIWebViewにを追加したUITapGestureRecognizerので、ユーザーがUIWebViewの任意の場所をタップすると、UIWebViewが大きくなり、より完全なhtml文字列が開きます。

YESを返すように設定した- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizerので、UITapGestureはUIWebViewで問題なく動作します。

しかし、UIWebView内のリンクをクリックすると問題が発生します。リンクをクリックすると、2つの操作が呼び出されます。1つはリンク用のブラウザを開くことで、もう1つはUIWebViewを拡大することです。

この矛盾は私が望むものではありません。

2つのケースを分離したいのですが、つまり、ユーザーがUIWebViewのリンクをクリックすると、そのリンクのブラウザーが開きます。ユーザーがURLリンクが存在しないUIWebViewをタップすると、UIWebViewが拡大されます。

2つのアクションを共存させるが、競合しないようにすることで、どうすればそれを解決できますか?

ありがとう

4

2 に答える 2

9

この質問が古いことは知っていますが、Google と Stack Overflow で数時間を費やしてきたので、将来この質問に出くわした人に役立つかもしれないと考えました。うまくいけば、これがこの問題を解決する正しい方法です。

リンクがクリックされたかどうかを判断する JavaScript コードを記述して、この問題を解決しました。私の解決策は、Stack Overflow のこの回答に基づいていました。UIWebView 内のすべてのリンクのリストと、getBoundingClientRect() を使用してそれらの境界を取得する JavaScript 関数があります。次に、関数 CGRectContainsPoint() は、指定された UITouch オブジェクトがリンク境界の四角形内にあるかどうかを教えてくれます。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    BOOL retVal = YES;

    //Check if a link was clicked
    NSString *js = @"function f(){ var a = document.getElementsByTagName('a'); var retVal = new Array(); for (var idx= 0; idx < a.length; ++idx){ var r = a[idx].getBoundingClientRect(); retVal[idx] = '{{'+r.left+','+r.top+'},{'+r.width+','+r.height+'}}'; } return retVal.join(';'); } f();";
    NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:js];

    NSArray *linkArray = [result componentsSeparatedByString:@";"];
    CGPoint touchPoint = [touch locationInView:self.webView];
    for ( NSString *linkRectStr in linkArray ) {
        CGRect rect = CGRectFromString(linkRectStr);
        if ( CGRectContainsPoint( rect, touchPoint ) ) {
            NSLog(@"Link Clicked");
            retVal = NO;
            break;
        }
    }

    return retVal;
}

このように JavaScript を使用しても、パフォーマンスが大幅に低下しないことを願っています。特に、タップごとに再計算する必要がある場合。

于 2013-04-13T04:23:19.210 に答える
0

UIWebViewのデリゲートの-webView:shouldStartLoadWithRequest:navigationTypeメソッドを実装できます。NOリンクを開かない場合に戻ります。

于 2011-08-27T18:29:30.190 に答える