这是一个非常好的问题,将 Web 视图与其内容相匹配有一些有趣的应用,例如使用适合其内容的 Web 视图在地图上显示信息窗口。
这是一个使用WKWebView 的解决方案,它首先创建一个 1×1px 大小的 Web 视图,加载其内容,并在相应地更新 Web 视图框架大小之前查询 Web 视图以找到其内容大小。有点hacky,但似乎是唯一的方法。
import WebKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
view.addSubview(webView)
webView.navigationDelegate = self
let htmlFile = Bundle.main.path(forResource: "index", ofType: "html")
let html = try! String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
webView.loadHTMLString(html, baseURL: nil)
}
}
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
var frame = webView.frame
webView.evaluateJavaScript("document.documentElement.offsetWidth", completionHandler: { ret, _ in
guard let width = ret as? CGFloat else { return }
print("setting width: ", width)
frame.size.width = width
webView.frame = frame
webView.evaluateJavaScript("document.documentElement.offsetHeight", completionHandler: { ret, _ in
guard let height = ret as? CGFloat else { return }
print("setting height: ", height)
frame.size.height = height
webView.frame = frame
})
})
}
}
我的示例 HTML 文件 (index.html):
<html>
<head>
<meta name="viewport" content="width=150, initial-scale=1.0">
<style>
html, body { margin: 0; padding: 0 };
</style>
</head>
<body>
<div style="height:280px;width:150px;background-color:cyan;"></div>
</body>
</html>
注意:如果可能,您应该尝试使用WKWebView 而不是UIWebView。 UIWebView 解决方案可能是可能的,但当WKWebView 应该更好地满足您的需求时,我认为不值得花费时间和精力。