WKWebView 未显示内容 "below the screen"
WKWebView not showing content "below the screen"
我必须将 WKWebView 集成到 UITableView 中(请不要质疑)。
我确保禁用了 WKWebView 滚动,这样我就避免了在可滚动视图 (UITableView) 中使用可滚动视图。
但是,当WKWebview里面的HTML内容很大时,比方说两倍屏幕,我发现屏幕下面的内容没有显示给用户,即当用户滚动table 视图只有 white\empty 屏幕,其中 WKWebView 是...
我根据以下内容更新WebViewTableViewCell的高度:
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let height = webView.scrollView.contentSize.height
...
...
delegate.updateWebViewCellHeight(height: self.cellHeight)
}
我想这可能是对 WKWebView 的一些优化的影响,它允许它仅在 DOM 显示在屏幕上时呈现它们。
我的问题是,我该怎么做才能确保在用户滚动 table 视图时向用户显示 WKWebView 中的所有内容?
P.S。 UIWebView 渲染所有内容都很好,它似乎只发生在 WKWebView
见下图:
这真的是 Apple 优化 - 只呈现网络视图的可见部分。关于这个问题还有几个类似的问题:
WKWebView screenshot not completely rendering full page height
How to capture a full page screenshot of WKWebview?
尝试在 table 视图委托的 scrollViewDidScroll:
方法中调用 [self.webView setNeedsDisplay]
。
您可以在WKWebView中调用setNeedsLayout,(Swift):
注意这是 UITableView 的滚动视图。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// use IndexPath for row/section with your WKWebView
if let cell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? WKWebViewCell { // Here we take our cell
cell.wkWebView?.setNeedsLayout()
}
}
见
确保在更新单元格高度时,TableViewCell 没有重新加载 WebView。否则你会陷入无限循环,奇怪的行为和高度会一次又一次地重置。
var CGFloat : webViewHeight = 0.0
//跟踪当前webView的高度。
// MARK: - WKWebView Delegate
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
weak var weakSelf = self
webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none';") { (object : Any?, error : Error?) in
if (error == nil) {
let size : CGRect = self.heightForWebView(webView: webView)
if (weakSelf.webViewHeight == 0.0 || size.height != weakSelf.webViewHeight){
weakSelf.webViewHeight = size.height
}
webView.frame = size
delegate.updateWebViewCellHeight(height: size.height)
}
}
}
// MARK: - WKWebView Heplper
func heightForWebView(webView : WKWebView)-> CGRect {
var rect : CGRect = webView.frame as CGRect!
rect.size.height = 1
webView.frame = rect
let newSize : CGSize = webView.sizeThatFits(CGSize.zero)
rect.size = newSize
return rect
}
我必须将 WKWebView 集成到 UITableView 中(请不要质疑)。
我确保禁用了 WKWebView 滚动,这样我就避免了在可滚动视图 (UITableView) 中使用可滚动视图。
但是,当WKWebview里面的HTML内容很大时,比方说两倍屏幕,我发现屏幕下面的内容没有显示给用户,即当用户滚动table 视图只有 white\empty 屏幕,其中 WKWebView 是...
我根据以下内容更新WebViewTableViewCell的高度:
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let height = webView.scrollView.contentSize.height
...
...
delegate.updateWebViewCellHeight(height: self.cellHeight)
}
我想这可能是对 WKWebView 的一些优化的影响,它允许它仅在 DOM 显示在屏幕上时呈现它们。
我的问题是,我该怎么做才能确保在用户滚动 table 视图时向用户显示 WKWebView 中的所有内容?
P.S。 UIWebView 渲染所有内容都很好,它似乎只发生在 WKWebView
见下图:
这真的是 Apple 优化 - 只呈现网络视图的可见部分。关于这个问题还有几个类似的问题:
WKWebView screenshot not completely rendering full page height
How to capture a full page screenshot of WKWebview?
尝试在 table 视图委托的 scrollViewDidScroll:
方法中调用 [self.webView setNeedsDisplay]
。
您可以在WKWebView中调用setNeedsLayout,(Swift):
注意这是 UITableView 的滚动视图。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// use IndexPath for row/section with your WKWebView
if let cell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? WKWebViewCell { // Here we take our cell
cell.wkWebView?.setNeedsLayout()
}
}
见
确保在更新单元格高度时,TableViewCell 没有重新加载 WebView。否则你会陷入无限循环,奇怪的行为和高度会一次又一次地重置。
var CGFloat : webViewHeight = 0.0
//跟踪当前webView的高度。
// MARK: - WKWebView Delegate
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
weak var weakSelf = self
webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none';") { (object : Any?, error : Error?) in
if (error == nil) {
let size : CGRect = self.heightForWebView(webView: webView)
if (weakSelf.webViewHeight == 0.0 || size.height != weakSelf.webViewHeight){
weakSelf.webViewHeight = size.height
}
webView.frame = size
delegate.updateWebViewCellHeight(height: size.height)
}
}
}
// MARK: - WKWebView Heplper
func heightForWebView(webView : WKWebView)-> CGRect {
var rect : CGRect = webView.frame as CGRect!
rect.size.height = 1
webView.frame = rect
let newSize : CGSize = webView.sizeThatFits(CGSize.zero)
rect.size = newSize
return rect
}