Перехватывать неиспользуемые события касания в UIWebView - PullRequest
4 голосов
/ 04 января 2011

Я работаю над приложением для iPad, которое основано на UIWebView: чтобы объяснить его в простейшем виде, приложение показывает одно большое интерактивное веб-представление и, кроме того, оно поддерживает пользовательские жесты.

Мне нужнодля отслеживания событий, которые представляют отдельные касания в веб-просмотре, но только в том случае, если они еще не были использованы веб-просмотром (т. е. они не являются началом операции прокрутки / масштабирования, они не являются касаниями по ссылкам, они не являются касаниями, которыевызвать некоторый javascript).

UIWebView очень жадный со своими событиями, и, по моему опыту, он имеет тенденцию не распространять их, даже когда они не используются.Чтобы поймать события, я выделил подклассы главного UIWindow (см. http://mithin.in/2009/08/26/detecting-taps-and-events-on-uiwebview-the-right-way/).. Это работает хорошо, но проблема в том, что я не могу распознать, вызвали ли нажатия, которые я получаю, какой-то JavaScript в веб-представленииили нет.

В качестве дополнительного ограничения я не могу контролировать JavaScript, который будет работать в UIWebView, или HTML, который будет отображаться.

Итак, вопрос звучит так:это: как можно было бы обнаружить все и только события касания, которые не вызывали никаких других действий в самом UIWebView, особенно действия javascript?

~

Если вам интересно,Исходный код проекта, над которым я работаю, находится на GitHub: чтобы найти его, просто попросите Google указать вам Baker Framework.

1 Ответ

4 голосов
/ 21 февраля 2012

Сделайте это с помощью JavaScript.Во-первых, после завершения загрузки вашего веб-вида прикрепите обработчик кликов javascript к телу, чтобы поглощать любые неиспользованные клики.Сделайте так, чтобы он загружал готовый домен в качестве действия:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *script = @"document.body.onclick = function () { document.location.href = 'http://clickhandler'; }"
    [webView stringByEvaluatingJavaScriptFromString:script];
}

Затем в вашем делегате веб-просмотра найдите попытки загрузить этот составленный домен и перехватите их.Теперь у вас есть способ перехватить этот обработчик щелчков JavaScript с помощью собственного кода и реагировать соответствующим образом:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([request.URL.host isEqualToString:@"clickhandler"])
    {
        //handle click
        //your logic here
        return NO;
    }
    return YES;
}
...