我有几个带有大量文本的uiwebviews。在制作window.scrollto(以及window.scroll)javascript调用webviews时,它们会滚动到一个不正确的位置。例如我想滚动到12000,但webview将每次滚动到10149。而另一个将滚动到10250.另一个,我想滚动到22000左右将每次滚动到20230。
这只发生在设备上而不是模拟器中。
我在webViewDidFinishLoad中进行调用。
我尝试多次拨打电话但没有更好的结果。似乎特定webview滚动到的任何值都是使用scrollto调用时最远的值。给它一个较小的值滚动到没有问题。只要你传递那个神奇的数字,无论它对于那个webview来说都是如此,它就不会再进一步了。
任何输入都会非常感激
答案 0 :(得分:1)
这可能发生的一个原因是,如果您在标记中引用图像而未明确声明其大小。调用webViewDidFinishLoad:时,您的图像可能尚未完成加载。浏览器最初使用一些假设的图像大小来布局页面。加载图像并且浏览器可以确定其实际尺寸后,它将重排页面,可能导致页面的总高度增加。如果您的window.scrollTo调用在此重排之前发生,您可能正在尝试滚动文档的末尾。
如果您的情况发生了这种情况,您可以通过在标记或CSS中明确声明img标记的尺寸来解决此问题。
如果由于某种原因你不能提前预测图像尺寸,你可以推迟你的window.scrollTo调用,直到图像完成加载后为window.onload注册一个javascript事件处理程序,直到所有图像都已完成加载。在事件处理程序中,将window.location.href导航到某个虚假URL,例如“app:imagesFinishedLoading”。在您的UIWebViewDelegate中,您可以实现webView:shouldStartLoadWithRequest:navigationType:拦截此导航,取消它,然后调用window.scrollTo。
答案 1 :(得分:1)
所以我发现问题是由于我过早调用scrollTo函数(虽然我在webViewDidFinishLoad中调用它,我假设只有在页面完全加载完成后才会调用它,并且在视觉上至少看起来确实如此)。我放入一个计时器让scrollTo方法在300毫秒之后被调用,并处理它。