2009-10-08 5 views
2

J'ai plusieurs uiwebviews avec une quantité considérable de texte. Lors de l'exécution d'un appel javascript window.scrollto (ainsi que d'un window.scroll) sur les webviews, ils défilent vers un emplacement incorrect. par exemple. Je veux faire défiler jusqu'à 12000 mais la webview défilera à 10149 chaque fois à la place. tandis qu'un autre va faire défiler jusqu'à 10250. encore un autre, que je veux faire défiler à 22000 ou alors fera défiler à 20230 à chaque fois à la place.window.scrollto javascript appel à uiwebview mal se comporter

Ceci se produit uniquement sur l'appareil et non sur le simulateur.

Je lance l'appel dans webViewDidFinishLoad.

J'ai essayé de faire l'appel plusieurs fois sans meilleurs résultats. il semble que la valeur affichée par le webview est la plus éloignée possible lors de l'utilisation de l'appel scrollto. il n'y a pas de problème en lui donnant une valeur moindre à faire défiler. c'est juste que si vous passez ce nombre magique, quel qu'il soit pour ce webview, il n'ira pas plus loin.

toute entrée serait très apprécié

+0

Merci d'avoir posé cette question. Je me cognais la tête contre le mur en essayant de comprendre cela. – markshiz

Répondre

1

Une raison pour laquelle cela pourrait se produire est que si vous faites référence à des images dans votre balisage sans déclarer explicitement leur taille. Vos images n'ont probablement pas fini de charger quand webViewDidFinishLoad: est appelé. Le navigateur définit initialement la page en utilisant une taille d'image supposée. Une fois que l'image est chargée et que le navigateur peut déterminer ses dimensions réelles, la page sera refondue, ce qui pourrait augmenter la hauteur totale de la page. Si votre appel window.scrollTo se produit avant cette rediffusion, vous pouvez essayer de faire défiler la fin du document.

Si c'est ce qui se passe dans votre cas, vous pouvez le résoudre en déclarant explicitement les dimensions de vos balises img dans votre balisage ou CSS. Si pour une raison quelconque, vous ne pouvez pas prédire les dimensions de l'image à l'avance, vous pouvez différer votre appel à window.scrollTo jusqu'à ce que les images aient été chargées en enregistrant un gestionnaire d'événements javascript pour window.onload, qui ne se déclenche pas jusqu'à ce que toutes les images aient fini de charger. Dans le gestionnaire d'événements, naviguez votre window.location.href vers une fausse URL comme "app: imagesFinishedLoading". Dans votre UIWebViewDelegate, vous pouvez implémenter webView: shouldStartLoadWithRequest: navigationType: pour intercepter cette navigation, annulez-la, puis faites votre appel à window.scrollTo.

+0

merci pour la suggestion. J'avais à un moment donné suspecté que le problème avait à voir avec des images, mais cela s'est produit avec des pages qui les contenaient et ne les contenaient pas. J'ai effectivement trouvé que le problème était dû au fait que j'appelais la fonction scrollTo trop tôt (bien que je l'ai appelée dans webViewDidFinishLoad que je supposais ne serait invoquée qu'une fois la page complètement chargée, et visuellement au moins cela semblait être le cas). J'ai donc mis dans une minuterie pour avoir la méthode scrollTo appelée 300 millisecondes plus tard, et qui s'en est occupé. – ilyashev

+0

Oui, webViewDidFinishLoad est trompeur. J'ai trouvé que le Javascript incorporé sur la page n'a généralement pas été interprété au moment où webViewDidFinishLoad est appelé, donc j'ai dû envoyer un message de JS à ObjC via webView: shouldStaqrtLoadWithRequest: navigationType sur une ou deux applications différentes . – cduhn

1

J'ai donc trouvé que le problème était dû au fait que j'appelais la fonction scrollTo trop tôt (bien que je l'ai appelée dans webViewDidFinishLoad, ce que je supposais ne serait invoqué qu'une fois la page complètement chargée et visuellement au moins être). J'ai mis dans une minuterie pour avoir la méthode scrollTo appelée 300 millisecondes plus tard, et qui a pris soin d'elle.

Questions connexes