相信很多小夥伴會遇到這種問題,就是一個商品的售賣的頁面下會有一個未知高度的圖文介紹,今天就淺談一下這個功能:
整個頁面以一個tableView進行實現,圖文詳情這塊主要是拿到後臺給到的html進行渲染,然後根據渲染後的頁面高度再做適配(h5頁面適配手機)
主體思路:
1.在tableViewFootView裡搭建好檢視以及webview
wkWebView = WKWebView() wkWebView.navigationDelegate = self wkWebView.uiDelegate = self wkWebView.scrollView.showsVerticalScrollIndicator = false wkWebView.scrollView.bounces = false wkWebView.scrollView.isScrollEnabled = false //這裡的footBackView是巢狀了一層=>方便外界直接修改footView的高度 footBackView.addSubview(wkWebView) //wkWebView佈局的程式碼用的是snapkit這裡不在詳情贅述
2.渲染頁面進行適配
private func filterMethod(urlStr: String) -> String { let headHtml = NSMutableString.init(capacity: 0) headHtml.append("<html>") headHtml.append("<head>") headHtml.append("<meta charset=\"utf-8\">") headHtml.append("<meta id=\"viewport\" name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=false\" />") headHtml.append("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />") headHtml.append("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\" />") headHtml.append("<meta name=\"black\" name=\"apple-mobile-web-app-status-bar-style\" />") headHtml.append("<style>img{max-width:100%;width:auto;height:auto}</style>") var bodyStr : String = String(headHtml) bodyStr.append(urlStr) return bodyStr } //以上這個方法主要作用是根據html的內容適配好各類手機寬高(model.introduction表示後臺給的html資料) self.wkWebView.loadHTMLString(self.filterMethod(urlStr: model.introduction ?? ""), baseURL: nil)
3.高度計算並重新整理footView,在wkwebView代理方法裡拿到高度並重新計算整個tabView的高度
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { var webheight = 0.0 // 獲取內容實際高度 webView.evaluateJavaScript("document.body.scrollHeight") { [unowned self] (result, error) in if let tempHeight: Double = result as? Double { webheight = tempHeight//這裡是獲取到內容高度 } //延遲更新高度 DispatchQueue.main.async { [unowned self] in //這裡可以更新tableViewfootView的高度,這個時候只需要改變footBackView的高度,然後重新給tableViewfootView賦值,xib的話可以透過 footView.systemLayoutSizeFitting(CGSize(width: pagingView.width, height: CGFloat.greatestFiniteMagnitude), withHorizontalFittingPriority: .required, verticalFittingPriority: .fittingSizeLevel)的方式進行高度適配 } } }