WKWebView - 放大后内容不合适

Posted

技术标签:

【中文标题】WKWebView - 放大后内容不合适【英文标题】:WKWebView - content not fitting after magnification 【发布时间】:2018-05-10 18:27:23 【问题描述】:

我在设置放大属性时遇到了WKWebView 的问题。

我希望内容能够像在 Safari 中一样调整大小以适应它。但我无法做到这一点。将放大倍率设置为小于 1.0 的值时如下所示。

多余的空间没有被使用,并且出现了边距。在 Safari 中,缩小会导致文本和图像变小,但实际上会占用额外的空间。

我正在使用带有 XIB 文件的 InterfaceBuild 来连接视图。

另外,我在viewDidLoad 中启用了放大功能。

webView.allowsMagnification = YES;

我也尝试了以下方法,但没有成功:

webView.translatesAutoresizingMaskIntoConstraints = NO;
webView.autoresizesSubviews = NO;
webView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;

任何提示将不胜感激。

【问题讨论】:

您可以使用自动布局。这要容易得多。只需添加 4 个边距布局:顶部、左侧、底部和右侧。应该直截了当 Thx Tai,我尝试了自动布局,但它没有改变任何东西......得到相同的结果。只要我不放大或缩小,调整窗口大小在这两种情况下都可以正常工作。 如何放大和缩小?顺便说一句 为了缩放,我设置了 WKWebView 的放大属性。 您是否尝试加载其他网站?如果它加载正常,它可能只是它的网站。如果网站在标题标签中有这样的视口元标签<meta name="viewport" content="initial-scale=1.0" />,它应该可以工作。我还尝试使用 WKWebview 加载 apple.com,将放大倍率设置为 0.3,看起来不错。 【参考方案1】:

问题是WKWebView 的放大属性并没有像你想象的那样做。它的作用是将渲染的页面作为一个整体进行缩放(考虑获取位图或图像并调整其大小)。

您想要的是 Safari(和其他浏览器)具有的动态缩放功能,通常称为“缩放”。这与magnification 不同,因为它会缩放页面的布局。这会单独放大或缩小页面的字体大小、元素大小等。

没有像 Safari 那样缩放页面的本地(公共)API,但您可以利用 CSS zoom property 做几乎相同的事情。这是一个可以做到这一点的扩展:

extension WKWebView 

    func zoom(to zoomAmount: CGFloat) 
        evaluatejavascript("document.body.style.zoom = '\(zoomAmount)'", completionHandler: nil)
    


可以这样使用:

webView.zoom(to: 0.9)

【讨论】:

这样做的问题是它不会导致布局更新,只会使内容变小。这与在 Safari 或 chrome 中按 Cmd-+/- 不同 我不明白你的意思。这与CMD+CMD- 的功能几乎相同。 (当然,您需要调整zoom(to:) 中的值) 是的,我已经这样做了,但是对于响应式网站,它不会重新布局内容,只会使其更小。例如,移动设备大小的布局不会变成桌面布局 @Jonathan。哦,那是不同的,但我明白你现在在寻找什么。您的解决方案可能是最好的(也是唯一的)方法。【参考方案2】:

为了尽可能接近 Cmd +/- 在 Safari/Chrome 中的作用,我增加了 WKWebView 的框架,然后反向转换图层:

    var zoomLevel: CGFloat = 1

    private func didTapZoomOut() 
        zoomLevel -= 0.2
        needsLayout = true
    

    override func layout() 
        super.layout()
        webView.frame.size = CGSize(width: frame.width * (1/zoomLevel), height: frame.height * (1/zoomLevel))
        webView.layer?.transform = CATransform3DMakeScale(zoomLevel, zoomLevel, 1)
    

这也会导致滚动条缩小,但对于我的用例来说这并不重要。

【讨论】:

【参考方案3】:

@mattsven 的答案似乎是正确的。这是他解决方案的客观 c 变体:

NSString *jsCommand = [NSString stringWithFormat:@"document.body.style.zoom = 1.5;"];
[[wkWebView evaluateJavaScript:jsCommand completionHandler:^(NSString *result, NSError *error) 
if(error != nil) 
    NSLog(@"Error: %@",error);
    return;


NSLog(@" Success");
];

好像WKWebView没有scalePagesToFit作为ios的UIWebView。

参考资料。onetwo

【讨论】:

以上是关于WKWebView - 放大后内容不合适的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS Swift 中的 cam 扫描仪 SDK 返回时,WKwebview 是空白屏幕?

iOS 13 beta 中 WKWebView 的内在内容大小问题

如何在 WKWebView 中设置默认缩放

在 wkwebview 上禁用放大/缩小

以编程方式启用/禁用捏合以放大 WKWebView 和 viewForZoomingInScrollView

获取 WKWebView 的内容高度不正确