Différencier Single Tap UiWebView et Lien de la page

Bonjour,



J'ai un petit soucis pour ajouter un single tap recognizer sur une UIWebView.



Le recognizer fonctionne correctement, mais la méthode est appelée même lorsqu'on clic sur un lien de la webview.



Comment faire pour différencier les deux ?



Merci !

Réponses

  • Je ne connais pas de solution simple.



    Tel que je le vois en l'état de mes connaissances : le Tap pourrait programmer une action au lieu de la lancer directement, et le délégué de la UIWebView pourrait annuler cette programmation s'il détecte qu'un lien a été activé.
  • Hello,



    Sinon peut être en mettant la UIWebView dans un container (UIView) et de rajouter le TapRecognizer a cette vue container, comme ça si y a un clique sur un lien de la webView, elle vas charger le lien sinon elle forward le message ( j'ai l'impression que je raconte des bêtises image/huh.gif' class='bbc_emoticon' alt='???' /> ), mais à  tester.



    PS : Moi aussi je doit implémentée cette fonctionnalité soit aujourd'hui ou Lundi, on se tient au courant. image/thumbsup.gif' class='bbc_emoticon' alt='' />
  • AliGatorAliGator Membre, Modérateur
    Je pense que mettre une vue sous la WebView ne fonctionnera pas car j'ai peur qu'une fois que la WebView a reçu l'évènement, elle ne le redescende pas à  la vue en dessous. En effet, le "hitTest" de la WebView doit correspondre à  la WebView entière, c'est donc elle qui préempte le tap (comme si tu mettais une UIView devant un bouton et que tu lui mettais userInteractionEnabled=YES).

    Mais bon, à  tester.



    Autre piste à  laquelle je penserai, c'est d'utiliser Javascript pour ça. Genre mettre un event sur l'évènement Javascript "ontouchended" de l'objet document.body, et que sur cet évènement, le code Javascript redirige vers une URL bidon, genre document.location = "tap://outside", qu'on pourra détecter via les méthodes de delegate adéquates ensuite.



    Le problème c'est que si on fait juste ça :
    document.body.addEventListener('ontouchended', function(e) { document.location = 'tap://outside'; }, true)
    
    Alors tout tap sur la WebView va déclencher l'évènement... et tout tap sur un lien va d'abord prendre le tap sur le lien en compte correctement... puis déclencher également l'évènement sur le document dans tous les cas. Sauf si pour chaque lien que tu cliques, tu annules ensuite la propagation de l'évènement (ce qui est possible, après tout, il suffit d'appeler e.stopPropagation() dessus), mais il faut le prévoir sur tous les liens de ta page.



    Si c'est toi qui fournit la page (genre HTML embarqué dans le bundle de ton appli), alors c'est faisable, faut juste penser à  rajouter le code qui va annuler la propagation de l'évènement de touch au document sur chaque lien. Si tu n'as que des liens "<a href>" en plus c'est pas dur, ça peut même se faire également en Javascript en bouclant sur tous les éléments avec document.getElementsByTagName("a"). Mais si ta page gère aussi d'autres zones cliquables, genre des div ou des img sur lesquels tu as un event onclick, un ontouchended, etc, il faudra penser à  faire de même pour chacun de ces cas.

    Si ce n'est pas toi qui fournit la page HTML mais que c'est une page du net sur laquelle tu n'as pas vraiment le contrôle du contenu, alors ça disque d'être bien plus difficile...
  • Algorithme :

    1. Lire la doc

    2. Essayer pour voir si on a compris

    3. Si on n'a pas compris aller en 1

    4. EUREKA



    Autre algorithme :

    1. Avoir une idée

    2. L'essayer

    3. Si ça marche pas lire la doc, puis retourner à  l'étape 1

    4. EUREKA



    On peut aussi mélanger ces deux algorithmes
Connectez-vous ou Inscrivez-vous pour répondre.