UIWebView内容偏移

时间:2014-03-11 08:14:31

标签: ios objective-c uiwebview

我想在我的应用中将一个google.maps网址显示到UIWebView中,但该页面出现在我想要的不同点上。我在这里尝试了很多问题,例如setviewOffset of webview.scrollview或contentInset或scrollsToTop,甚至是javascript命令,但它们都没有。所以这就是问题所在:

wrong

这是我想要的预期结果:

enter image description here

我希望我的网页能够排在最前面,而不是在中间。

网址url

1 个答案:

答案 0 :(得分:1)

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

不幸的是,除了从服务器提供的html中提取滚动代码,然后在webview中加载它之外,没有什么办法可以阻止它。这将是乏味的,你不应该这样做,因为一旦谷歌对该页面的内部工作进行了更改,这可能会破坏你的应用程序。

我现在能想到的唯一解决方案是在页面向下滚动后以编程方式将页面滚动回顶部。我已经尝试了你提供的网址,它实际上是有效的。为此,请在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加载并完成所有滚动操作...

尽管如此,虽然不太可能且不那么致命,但这可能也会破裂。当我尝试我的解决方案时,2秒的延迟就足够了。如果谷歌将来减慢动画速度,2秒可能还不够,你的scrollBackToTop方法会提前触发。由于java脚本不会取消正在进行的滚动,因此它根本不会回滚到顶部。

修改

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

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

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

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

所以你需要通过这样做来撤消黑客攻击:

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

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

您可能希望阻止用户在1.2秒内滚动,方法是禁用在webviews滚动视图上滚动,直到计时器触发为止。

所以还有改进的余地,但与隐藏webview直到它来回滚动相比,这种方法可能会让你的应用感觉更具响应性......