iOS-tableview【終極方案】精准獲取webView內容高度,自適應高度


 

關於WebView內容高度的獲取,相信很多人都踩過坑,無法獲取到准確高度,導致頁面布局出現差錯,搜到的資料很多但都無法解決問題,以下是個人經驗總結:

項目需求實現H5文章&原生評論效果,文章是加載H5鏈接,評論信息是后台接口提供,以列表形式展示。

實現思路:

1. webView加載H5鏈接,設置它為tableView的 headerView,下方評論信息用Cell加載展示。

2. 在webView的回調方法webViewDidFinishLoad中獲取網頁內容高度,設置為webView的高度,重新將webView賦給tableView的headerView。

Tip: 將一個View賦值給UITableView的tableHeaderView時,不需要手動設置高度,HeaderView會自動使用View的高度。

 

像上面這樣,類似的方法很多,無論是JS獲取,還是contentSize獲取,最后結果都難以獲取到准確高度,並非方法不行,而是:

webViewDidFinishLoad代理方法被調用時,頁面並不一定完全展現完成,可能有圖片還未加載出來,導致此時獲取的高度是並不是最終高度,過會兒圖片加載出來后,瀏覽器會重新排版,而我們在這之前給了一個錯誤高度,導致顯示異常。

問題原因已確定,解決思考:

如何能在webViewDidFinishLoad之后獲取到網頁內容高度的變化?

答案:監聽!

具體實現過程:

給webView的scrollView的contentSize屬性添加監聽,每當內容發生變化,contentSize一定會跟着變,捕獲這個變動,在監聽方法中實現webViewDidFinishLoad中的代碼,也就是獲取最新的內容高度賦給webView:

 

另外,在cell中使用webView獲取高度不准確的解決辦法跟上面一樣,只不過需要注意cell中使用webView涉及到cell重用,會導致滑動列表時webView多次加載,影響性能,建議緩存高度。

注意:

如果不走監聽,要先懷疑自己,不要懷疑我!

1. 確保webview已經加在頁面上了,並且能夠正常顯示,然后再繼續獲取內容高度,如果都顯示不了,別來找我!

2. 是給webview的scrollview添加監聽,不要加在webview上,否則累死你也不會走監聽方法!

3. 如果你用的是swift,那請先看這篇文章:Swift中KVO(監聽)的使用方法及注意事項


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM