Как обнаружить нажатие на UIWebView, если это не ссылка

Итак, я хотел бы обнаружить нажатие на UIWebView, если он не нажимает на ссылку. Как мне это сделать? Я знаю, что:

- (BOOL)webView:(UIWebView *)webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

вызывается каждый раз, когда нажимается ссылка. Однако, как я узнаю, если он коснулся UIWebView, который отличается от ссылки? Я искал сеть, и ближайший я нашел this. Однако это не говорит мне, есть ли ответ на ссылку или нет.

Ответ 1

Я считаю, что следующий метод должен работать теоретически. Вы можете сделать, это обернуть UIWebView в контейнер UIView и установить распознаватели жестов в представлении контейнера. Тогда события касания, которые не обрабатываются UIWebView, будут переданы иерархии представлений и будут перехвачены представлением вашего контейнера.

В контейнере UIView реализуйте соответствующие обработчики, и вы можете обнаружить ответвления. Надеюсь, это ясно...

Если этот подход не приносит плода, вы можете перейти на javascript-маршрут. т.е. размещать события javascript в качестве загружаемых веб-страниц, и вам хорошо идти. Подробнее см. Здесь - Работает ли UIGestureRecognizer на UIWebView?

Ответ 2

Позвольте мне рассказать вам, почему это невозможно.

- (BOOL)webView:(UIWebView *)webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
  • Даже если это звучит нелепо, будут вызовы этого метода делегата, когда пользователь нажал ссылку с типом навигации UIWebViewNavigationTypeOther вместо UIWebViewNavigationTypeLinkClicked. Это происходит с некоторыми страницами на основе javascript, которые обычно встречаются в Интернете.

  • Даже если это звучит совершенно безумно, вызовы этого метода делегирования будут выполняться с помощью UIWebViewNavigationTypeLinkClicked несколько раз, когда на самом деле пользователь не нажал ссылку. Некоторые веб-сайты встраивают содержимое фрейма /iframe, используя имитированный клик по скрытой кнопке, который вызывает несколько вызовов с помощью UIWebViewNavigationTypeLinkClicked.

    Этот странный способ встраивания контента с помощью имитированного клика чтобы обойти настройки конфиденциальности некоторых браузеров. Google был подан в суд для этого некоторое время назад и пришлось заплатить несколько миллионов штрафов, потому что они использовали этот трюк для установки файлов cookie в браузере Safari даже если пользователь настроил браузер, чтобы не принимать эти печенье.

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

Но что именно вы пытаетесь сделать?