方案一
一开始是想到在用个scollview里面嵌入一个头部view,然后在头部view下面在嵌入一个webview。
这样的话使得界面变得复杂、臃肿。这个页面是通过scollview来滚动的,所以我们要计算出webview实际内容有多高,我们不能通过一个链接就知道有多高吧,所以需要等webview加载完成之后才能知道具体内容高度
获取webview高度方法:
// webview加载完成
func webViewDidFinishLoad(_ webView: UIWebView) {
// 获取webView高度
// 方法1 // 记录高度,有时候计算的高度不准确
let webViewHeight1 = webView.stringByEvaluatingJavaScript(from: "document.body.scrollHeight") ?? ""
let webViewHeight2 = webView.stringByEvaluatingJavaScript(from: "document.body.offsetHeight") ?? ""
let webViewHeight3 = webView.stringByEvaluatingJavaScript(from: "document.body.clientHeight") ?? ""
print("方法1:\(webViewHeight1):\(webViewHeight2):\(webViewHeight3)")
// 方法2
let webViewHeight4 = webView.scrollView.contentSize.height
print("方法2:\(webViewHeight4)")
// 方法3
let size = webView.sizeThatFits(CGSize.zero)
print("方法3:\(size.height)")
// 方法4
if webView.subviews.count > 0 {
let scrollerView = webView.subviews[0];
if scrollerView.subviews.count > 0 {
let webDocView = scrollerView.subviews.last;
let webViewHeight = webDocView!.frame.size.height;
print("方法4\(webViewHeight)")
if webDocView?.classForCoder == NSClassFromString("UIWebDocumentView") {
let webViewHeight = webDocView!.frame.size.height;
print("方法4\(webViewHeight)")
// 更新表上控件的frame
// _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
}
}
}
}
获取完高度还要重新刷新高度
方案二
为何一定要把webview嵌套在scollview中呢,webview本身就有scollview啊,如果可以在webview中的scollview里面添加头部不是更好吗。
添加头部view
方法1
private func addHeaderView1() {
// 内容偏移height
webView.scrollView.contentInset = UIEdgeInsetsMake(height, 0, 0, 0)
// 内容的初始位置-height
webView.scrollView.contentOffset = CGPoint(x: 0, y: -height)
// 内容高度 = 原始高度 - height
webView.scrollView.contentSize = CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height-height)
// 添加头部
let headerView = UIView(frame: CGRect(x: 0, y:-height, width: UIScreen.main.bounds.size.width, height: height))
headerView.backgroundColor = UIColor.yellow
self.webView.scrollView.addSubview(headerView)
}
方法2
private func addHeaderView2() {
let headerView = UIView(frame: CGRect(x: 0, y:0, width: UIScreen.main.bounds.size.width, height: height))
headerView.backgroundColor = UIColor.yellow
let browserCanvas = webView.bounds
for subView in webView.scrollView.subviews {
var subViewRect = subView.frame
if(subViewRect.origin.x == browserCanvas.origin.x &&
subViewRect.origin.y == browserCanvas.origin.y &&
subViewRect.size.width == browserCanvas.size.width &&
subViewRect.size.height == browserCanvas.size.height)
{
let height = headerView.frame.size.height
// 内容偏移height
subViewRect.origin.y = height
// 内容高度 = 原始高度 - height
subViewRect.size.height = subViewRect.size.height - height
// 重新设置高度
subView.frame = subViewRect
}
}
webView.scrollView.addSubview(headerView)
webView.scrollView.bringSubview(toFront: headerView)
}
网友评论