UIWebView不能自动缩放内容以适应页面

48
我有一个Webview,它是层次结构中的顶层窗口,并已如下所示声明。 但是,它不会缩放页面以适应。 页面在左上角对齐,但尺寸不变,尽管'scalesPageToFit'属性被设置为YES。 能否提供任何帮助将不胜感激。
webLookupView = [[UIWebView alloc] initWithFrame:CGRectMake(16, 63, 289, 327)];
webLookupView.backgroundColor = [UIColor lightGrayColor];
webLookupView.dataDetectorTypes = UIDataDetectorTypeAll;
webLookupView.scalesPageToFit = YES;
12个回答

36

iOS5提供了更好的解决方案

在webViewDidFinishLoad中调用此函数。

- (void)zoomToFit
{ 
    if ([theWebView respondsToSelector:@selector(scrollView)])
    {
        UIScrollView *scrollView = [theWebView scrollView];

        float zoom = theWebView.bounds.size.width / scrollView.contentSize.width;
        scrollView.minimumZoomScale = zoom;
        [scrollView setZoomScale:zoom animated:YES];
    }
}

我尝试了,但对我没有用。方法webViewDidFinishLoad被调用,但它并不影响大小。 - Dejell
你还需要手动验证缩放范围!我认为这是关键 :)scroll.zoomScale = MIN(MAX(zoom, scroll.minimumZoomScale), scroll.maximumZoomScale) - rudyryk
1
已经工作,但需要在Webview上勾选“缩放页面以适应”。 - codrut
2
这很棒,但是一旦它被缩放,它就会立刻弹回到先前的大小。有什么想法吗? - Alex Zavatone
我没有。是别人做的。仍然不知道为什么会发生这种情况。 - Alex Zavatone
显示剩余3条评论

29

我后来发现有些网页已经正确缩放了,但有些没有。对于那些没有正确缩放的网页,可以使用JavaScript来控制缩放,具体如下:

我后来发现有些网页已经正确缩放了,但有些没有。对于那些没有正确缩放的网页,可以使用JavaScript来控制缩放,具体如下:

NSString *jsCommand = [NSString stringWithFormat:@"document.body.style.zoom = 1.5;"];
[webLookupView stringByEvaluatingJavaScriptFromString:jsCommand];

1
那种方法的问题在于我可以看到它以实际大小加载页面,一秒钟后才会更新为正确的大小...这看起来不好。你有另一个解决方案吗? - Lior Frenkel
不幸的是我不会,但我可以建议在缩放完成之前隐藏webview。 - RunLoop
CSS缩放不适用于许多网站,因此首选[scroll setZoomScale:animated:],但需要验证缩放是否在适当范围内!看起来像是UIWebView类中的错误或奇怪的行为。请查看我上面的评论 :) - rudyryk

23

你可以使用以下代码:

self.webView.scalesPageToFit = YES;
self.webView.contentMode = UIViewContentModeScaleAspectFit;

- (void)webViewDidFinishLoad:(UIWebView *)webView方法或viewDidLoad


2
或者在 Interface Builder 中 :) - RyanM
它只在viewDidLoad中工作,而不是webViewDidFinishLoad(至少对我来说是这样)。 - Soul Clinic

17
如果您可以访问所加载的HTML,您可以在头部添加以下元标记:
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />

10

在Swift2中

self.webView.scalesPageToFit = true
self.webView.contentMode = UIViewContentMode.ScaleAspectFit

或者只需在webview的属性检查器中勾选“Scales page to fit”以适应storyboard或xib。 - Bhumit Mehta

2

如果有人在寻找WKWebView的答案,请尝试以下代码:

extension YourViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"
        webView.evaluateJavaScript(jscript)
    }
}

记得设置Webview的navigationDelegate

这就是答案! - Sergio

2

我在Swift中的解决方案:

在界面构建器中需要勾选webView上的“缩放页面以适应”。

使用UIWebViewDelegate。

func webViewDidFinishLoad(webView: UIWebView) {
    let zoom = webView.bounds.size.width / webView.scrollView.contentSize.width
    webView.scrollView.setZoomScale(zoom, animated: true)
}

2
正文:如mprivate这里所提到的那样,您可以更新UIWebView的缩放级别。
- (void)webViewDidFinishLoad:(UIWebView *)theWebView {
  CGSize contentSize = theWebView.scrollView.contentSize;
  CGSize viewSize = theWebView.bounds.size;

  float rw = viewSize.width / contentSize.width;

  theWebView.scrollView.minimumZoomScale = rw;
  theWebView.scrollView.maximumZoomScale = rw;
  theWebView.scrollView.zoomScale = rw;  
}

另一种实现方式是在webViewDidFinishLoad中注入js代码,就像RunLoop所说的那样。
- (void)webViewDidFinishLoad:(UIWebView *)webView {
  CGFloat scale = 0.8; // the scale factor that works for you 
  NSString *js = [NSString stringWithFormat:@"document.body.style.zoom = %f;",scale];
  [webView stringByEvaluatingJavaScriptFromString:js];
}

1
对于Swift 3,使用RunLoop的有效答案是: self.webView.stringByEvaluatingJavaScript(from: "document.body.style.zoom = 1.5;")

1
在xCode 8.3.3中,进入包含网页视图的视图/场景的Storyboard,并在属性检查器部分勾选“缩放页面以适应”选项。同时选择“填充缩放”作为内容模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接