Ios UIWebView内容偏移量
我想在我的应用程序中将google.maps url显示到UIWebView中,但页面的显示点与我想要的不同。我在这里尝试了很多问题,例如设置webview.scrollview的contentOffset或contentInset或scrollsToTop,甚至使用javascript命令,但这两个命令都不起作用。所以这就是问题所在: 这是我希望得到的预期结果: 我希望我的网页出现在顶部而不是中间。 url:Ios UIWebView内容偏移量,ios,objective-c,uiwebview,Ios,Objective C,Uiwebview,我想在我的应用程序中将google.maps url显示到UIWebView中,但页面的显示点与我想要的不同。我在这里尝试了很多问题,例如设置webview.scrollview的contentOffset或contentInset或scrollsToTop,甚至使用javascript命令,但这两个命令都不起作用。所以这就是问题所在: 这是我希望得到的预期结果: 我希望我的网页出现在顶部而不是中间。 url: 这与内容偏移量等无关-是页面本身在加载完成后立即向下滚动。在Mobile Saf
这与内容偏移量等无关-是页面本身在加载完成后立即向下滚动。在Mobile Safari中加载URL时,您将获得完全相同的行为,甚至可以观察滚动动画 不幸的是,除了在将滚动代码加载到webview之前从服务器提供的html中提取滚动代码之外,您无法阻止它。这将是乏味的,你无论如何都不应该这样做,因为一旦谷歌对该页面的内部工作进行了更改,这可能会破坏你的应用程序 我现在能想到的唯一解决方案是,在页面向下滚动后,以编程方式将其滚动回顶部。我用你提供的网址试过了,效果很好。为此,请在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加载并完成所有滚动操作
但要注意,虽然可能性较小,杀伤力也较小,但这种情况也可能发生。当我尝试我的解决方案时,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秒的延迟就成功了
您可能希望禁用webviews scrollview上的滚动,直到计时器触发,以防止用户在这1.2秒内滚动
因此,仍有改进的余地,但这种方法可能会让你的应用程序感觉更灵敏,而不是在Web视图前后滚动之前隐藏它…如何生成/获取URL?也许它包括跳转到锚?谢谢你的回复@Toastor。当我添加一些poi时,这个url是从谷歌获取的。我编辑了我的问题并添加了url。我没有格式化url。