動態獲取UIWebView高度

動態獲取UIWebView高度

發表於5個月前(2015-06-08 16:47)   閱讀( 325) | 評論(0) 4人收藏此文章, 我要收藏
0

阿里雲攜手開源中國衆包平臺發佈百萬懸賞項目 »  web

 

目錄[-]markdown

場景

在 App 中加載網頁時,一般狀況咱們只須要直接初始化一個 WebView,而後去加載對應的 URL 便可,但如果有時候有些個設計是須要將 web 與原生的 UI 搭載在一塊兒,通常狀況下,webView 的 內容一頁是確定不夠的,換句話說,webView 的高度是不定的,那若是原生的 UI是一個 ScrollView,高度也是不定的,那放在一塊兒的話就會有兩個 ScrollView 分別滾動,而這樣的體驗是不好的(嘗試過的都懂)。app

這裏的實際場景是: 將 webView 設置爲 TableView 的 headerView,tableView 可滾動,WebView 不可滾動。oop

嘗試

咱們想要的結果是將 WebView 設置爲不可滾動,與原生的 UI 融合在一塊兒,那這種狀況下,咱們必須獲得 WebView 的內容高度,讓 WebView 的高度與它所須要加載的網頁的內容高度一致,才能讓 WebView 將內容徹底顯示。阿里雲

開始我是在加載完成的回調中去獲取 webView 的 contentSize的高度lua

- (void)webViewDidFinishLoad:(UIWebView *)webView{ webViewHeight=[webView.scrollView contentSize].height; CGRect newFrame = webView.frame; newFrame.size.height = webViewHeight; webView.frame = newFrame; mainTableView.sectionHeaderHeight = webViewHeight; [mainTableView setTableHeaderView:webView]; } 

用這樣的方法獲得高度頗有可能不是web的真實高度,若是web中有不少 圖片未加載完成 的話,獲取的高度將小於真實高度,那在它加載完成後,內容將顯示不全。spa

解決

最終我是監聽了 webView的 contentSize,每當contentSize的值改變時就去更改webView 的frame。.net

[activityWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; 

而後在回調方法裏改變webView的frame設計

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"contentSize"]) { webViewHeight = [[activityWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]; CGRect newFrame = activityWebView.frame; newFrame.size.height = webViewHeight; activityWebView.frame = newFrame; [mainTableView setTableHeaderView:activityWebView]; } } 

在頁面消失時記得 remove 監聽對象,不然會閃退code

-(void)viewWillDisappear:(BOOL)antimated{ [super viewWillDisappear:antimated]; [activityWebView.scrollView removeObserver:self forKeyPath:@"contentSize" context:nil]; }
相關文章
相關標籤/搜索