UIWebView内容偏移

我想显示在我的应用程序的UIWebView的google.mapsurl,但页面出现在这个我想要的不同点。 我尝试了很多问题的一切,如设置webview.scrollview的contentOffset或contentInset或ScrollsToTop,甚至与JavaScript的命令,但他们都没有工作。所以这是问题:

错误

这是我希望得到的预期结果:

在这里输入图像说明

我希望我的网页在上面而不是在中间。

url : url

这与内容偏移等无关 – 它是在加载完成后向下滚动的页面本身。 在Mobile Safari中加载URL时,您将看到完全相同的行为,甚至可以观察到滚动animation。

不幸的是,没有什么可以做的,以防止它,除了提取滚动代码从服务器提供的HTML之前,加载到web视图。 这将是乏味的,你不应该这样做,因为这可能会打破你的应用程序一旦由谷歌进行的内部工作的网页。

我现在唯一能想到的解决scheme就是在页面向下滚动后,将页面滚动回页首。 我已经与你提供的url一起尝试过,它很有效。 为此,在您的webview委托中实现webViewDidFinishLoad:

-(void)webViewDidFinishLoad:(UIWebView *)webView { NSTimer *scrollTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(scrollBackToTop) userInfo:nil repeats:NO]; // Better make the timer an ivar } 

并实现如下方法:

 -(void)scrollBackToTop { NSString* javascript = [NSString stringWithFormat:@"window.scrollTo(0, 0);"]; [theWebView stringByEvaluatingJavaScriptFromString:javascript]; } 

这当然意味着你的webview会首先向下滚动,只能跳回顶端,这相当难看。 所以你可能想隐藏webview后面的一个不透明的视图,包含一个活动指标或类似的东西,直到webview已经加载并完成了所有的滚动动作…

尽pipe如此,虽然这样做的可能性较小,致命性也较低,但这也可能会打破。 当我尝试我的解决scheme时,2秒的延迟就足够了。 如果谷歌在未来减慢animation,2秒可能是不够的,你的scrollBackToTop方法提前触发。 由于java脚本不会取消正在进行的滚动,因此它将不会回滚到顶部。

编辑:

也许我有更好的东西给你…

在webViewDidFinishLoad方法中执行以下操作:

 NSString* javascript = [NSString stringWithFormat:@"document.getElementById('panel').style.position='fixed'; document.getElementById('panel').style.top='50px';"]; [webView stringByEvaluatingJavaScriptFromString:javascript]; 

这将完全抑制滚动animation。 但是它的代价是:如果用户现在手动滚动webview,表单字段保持固定位置,而页面的其余部分则正常滚动。

所以你需要撤消黑客,这样做:

 NSString* javascript = [NSString stringWithFormat:@"document.getElementById('panel').style.position='absolute'; document.getElementById('panel').style.top='0px';"]; [theWebView stringByEvaluatingJavaScriptFromString:javascript]; 

在滚动脚本完成之后,您需要再次延迟执行第二步,否则页面将执行完整滚动。 对我来说,1.2秒的延迟是个诀窍。

您可能想通过禁用webviews滚动视图上的滚动来防止用户在1.2秒内滚动,直到定时器激活。

所以还有改进的空间,但是这种方法可能会让你的应用感觉更有反应,相比于隐藏webview直到它滚动来回…