как обнаружить нажатие на UIWebView, если это не ссылка - PullRequest
10 голосов
/ 12 марта 2012

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 июня 2014

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

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

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

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

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

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

0 голосов
/ 12 марта 2012

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

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

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

...