前要
我在使用UITableView嵌套WKWebView的行程那種網頁帶列表的新聞瀏覽的形式,我使用的就是UITaleView的tableHeaderView
使用WKwebview
來代替,本身WKwebview
就是繼承UIview,這個就涉及到計算WKwebView的內容的高度了,我起初在- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
這個方法中計算WKWebView的內容的高度(使用js與oc交互調用,不會自行百度),發現這裏計算的高度根本不對,只能嘗試延遲獲取WKWebView的高度,但是發現延遲獲取,wekView的高度太大話還是獲取的不對,幸虧還有KVO
這種東西,可以監聽webView.scrollView
的contentSize
的變化,這樣就可以很容易的獲取高度,最後發現contentSize的的監聽方法執行了多次,說明wkWebView的內容變化多次,但是在
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context;
這個方法中不管幾次,最後執行刷新這個佈局就可以了呀。
問題以及問題解決
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
CGSize new_size = [[change objectForKey:@"new"] CGSizeValue];
_web_view.height = new_size.height;
_tableviewHeadview.height = new_size.height;
_detaiTableView.tableHeaderView.height = new_size.height;
[_detaiTableView reloadData];
}
}
這個方法可以監聽WKWebView.ScrollView
的變化,在iOS10以下會有問題,整個界面會被WKwebView覆蓋,並且還不能滑動,但是在iOS10(包括iOS10)以上就可以這樣,正常刷新整個TableView界面,這個問題還是我同事的iOS9.8的系統手機發現,目前解決的方法就是把這裏的_detaiTableView.tableHeaderView.height = new_size.height;
換成_detaiTableView.tableHeaderView = _tableviewHeadview
重新賦值一下頭部HeadView一次,不去改變高度,這個問題很坑爹,就是在此記錄一下。