iphone - TapGesture в UIWebView конфликтует с нажатием ссылки - PullRequest
7 голосов
/ 27 августа 2011

У меня есть загруженная строка UIWebView html со ссылками внутри.если я нажму на URL-ссылки, откроется внутренний самодельный браузер, чтобы открыть эту ссылку.

Я добавил UITapGestureRecognizer в UIWebView, поэтому, если пользователь нажимает в любом месте UIWebView, UIWebView станет большеи откройте более полную строку html.

Я установил - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer для возврата ДА, поэтому UITapGesture работает на UIWebView без проблем.

, но возникает проблема, когда я нажимаю на ссылку внутриUIWebView.щелчок по ссылке вызовет две операции: одна открывает браузер для ссылки, а другая - для расширения UIWebView.

Это противоречие не то, что я хочу.

Я хочу разделить два случая, т. Е. Если пользователь щелкнет ссылку в UIWebView, то откроется браузер для этой ссылки;если пользователь нажимает на UIWebView, где не существует URL-ссылок, UIWebView увеличивается.

Как я могу решить это путем сосуществования двух действий, но без конфликта?

Спасибо

Ответы [ 2 ]

8 голосов
/ 13 апреля 2013

Я знаю, что этот вопрос старый, но я потратил несколько часов на Google и Stack Overflow, и я подумал, что это может помочь кому-то, кто столкнется с этим вопросом в будущем. Надеюсь, что это правильный способ решить эту проблему.

Я решил эту проблему, написав некоторый код JavaScript, чтобы определить, была ли нажата ссылка. Мое решение было основано на этом ответе о переполнении стека. Есть функция JavaScript, которая получает список всех ссылок в UIWebView и их границ с помощью getBoundingClientRect (). Затем функция 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 таким способом не приведет к значительному снижению производительности. Особенно, когда он должен пересчитываться при каждом нажатии.

0 голосов
/ 27 августа 2011

Вы можете реализовать метод -webView:shouldStartLoadWithRequest:navigationType вашего UIWebView делегата.Возвращайте NO, если не хотите открывать ссылку.

...