2009-10-08 3 views
2

У меня есть несколько uiwebviews со значительным количеством текста. при вызове javascript window.scrollto (а также window.scroll) на веб-просмотры, они прокручиваются до неправильного местоположения. например я хочу прокрутить до 12000, но веб-просмотр будет прокручиваться до 10149 каждый раз вместо этого. в то время как другой будет прокручиваться до 10250. Еще один, который я хочу прокрутить до 22000 или около того, будет прокручиваться до 20230 каждый раз вместо этого.window.scrollto javascript call to uiwebview misbehaving

Это происходит только на устройстве, а не в симуляторе.

Я делаю звонок в webViewDidFinishLoad.

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

любой вход будет высоко ценится

+0

Благодарим вас за это. Я ударился головой о стену, пытаясь понять это. – markshiz

ответ

1

Одной из причин этого может произойти, если вы ссылку изображения в разметке без объявления их размеров в явном виде. Возможно, ваши изображения не завершили загрузку, когда вызывается webViewDidFinishLoad:. Браузер сначала излагает страницу с использованием предполагаемого размера изображения. Как только изображение будет загружено, и браузер сможет определить его реальные размеры, он будет переплавлять страницу, что может привести к увеличению общей высоты страницы. Если ваш вызов window.scrollTo происходит до этого пересчета, возможно, вы попытаетесь прокрутить страницу до конца.

Если это то, что происходит в вашем случае, вы можете разрешить его, объявив размеры ваших тегов img явно в своей разметке или CSS.

Если по какой-либо причине вы не можете заранее предсказать размеры изображения, вы можете отложить свое окно window.scrollTo до тех пор, пока изображения не завершили загрузку, зарегистрировав обработчик событий javascript для window.onload, который не срабатывает пока все изображения не закончили загрузку. В обработчике событий перейдите на свой файл window.location.href на какой-то поддельный URL-адрес, например «app: imagesFinishedLoading». В UIWebViewDelegate вы можете реализовать webView: shouldStartLoadWithRequest: navigationType: перехватить эту навигацию, отменить ее, а затем сделать свой вызов window.scrollTo.

+0

спасибо за предложение. я в какой-то момент подозревал, что проблема связана с изображениями, но она произошла со страницами, которые делали и не содержали их. Я действительно обнаружил, что проблема связана с тем, что я слишком рано вызываю функцию scrollTo (хотя я назвал ее в webViewDidFinishLoad, которую я предположил, будет вызван только после полной загрузки страницы и, по крайней мере, визуально, по крайней мере, это похоже). поэтому я поставил таймер, чтобы метод scrollTo назывался 300 миллисекунд позже, и это позаботилось об этом. – ilyashev

+0

Да, webViewDidFinishLoad обманчив. Я обнаружил, что Javascript, встроенный на страницу, как правило, не был интерпретирован к тому времени, когда вызывается webViewDidFinishLoad, поэтому мне пришлось прибегнуть к отправке сообщения от JS в ObjC через webView: shouldStaqrtLoadWithRequest: navigationType в нескольких разных приложениях , – cduhn

1

поэтому я обнаружил, что проблема связана с тем, что я вызываю функцию scrollTo слишком рано (хотя я назвал ее в webViewDidFinishLoad, которую я предположил, будет вызван только после полной загрузки страницы и, по крайней мере, визуально быть). Я поставил таймер, чтобы метод scrollTo назывался 300 миллисекунд позже, и это позаботилось об этом.