Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIWebView内容偏移量_Ios_Objective C_Uiwebview - Fatal编程技术网

Ios UIWebView内容偏移量

Ios UIWebView内容偏移量,ios,objective-c,uiwebview,Ios,Objective C,Uiwebview,我想在我的应用程序中将google.maps url显示到UIWebView中,但页面的显示点与我想要的不同。我在这里尝试了很多问题,例如设置webview.scrollview的contentOffset或contentInset或scrollsToTop,甚至使用javascript命令,但这两个命令都不起作用。所以这就是问题所在: 这是我希望得到的预期结果: 我希望我的网页出现在顶部而不是中间。 url: 这与内容偏移量等无关-是页面本身在加载完成后立即向下滚动。在Mobile Saf

我想在我的应用程序中将google.maps url显示到UIWebView中,但页面的显示点与我想要的不同。我在这里尝试了很多问题,例如设置webview.scrollview的contentOffset或contentInset或scrollsToTop,甚至使用javascript命令,但这两个命令都不起作用。所以这就是问题所在:

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

我希望我的网页出现在顶部而不是中间。

url


这与内容偏移量等无关-是页面本身在加载完成后立即向下滚动。在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。