WebView使用 之 獲取 WebView 實際內容高度 及 其中一種導致WebView展示不全的bug
阿新 • • 發佈:2019-01-06
最近專案中,有一個模組,需要大量的圖表。而且產品明確表明,圖表只有一個要求,就是要好看,座椅使用原生控制元件,畫的話,費時費力不說,還不一定好看。所以呢,我們就用了ECharts外掛,iOS直接使用webView呼叫H5介面。產品的需求是在不同的螢幕上展示的圖表要和諧(重點是好看),所以嘍,這就導致了,我們要在呼叫html連結生成之前,要把不同螢幕所要展示的WebView的高度傳入連結中。在實際的展示中發現一個問題,恩,這個問題一會再說。現在先說說獲取實際內容高度
1. WKWebView
現在很多應用都從iOS 8開始支援了,所以終於可以肆無忌憚的使用WKWebView了。在WKWebView使用過程中,獲取實際內容高度,在介面載入完成時,呼叫
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { [webView evaluateJavaScript:@"document.body.offsetHeight"completionHandler:^(id_Nullable result,NSError *_Nullable error) { CGFloat documentHeight = [resultdoubleValue]; CGRect frame = webView.frame; frame.size.height = documentHeight; webView.frame = frame; NSLog(@"webView.frame = %@",NSStringFromCGRect(webView.frame)); }]; }
2.UIWebView
好吧,獲取UIWebView實際內容高度的方法,已經爛大街了,但是還是記錄一下吧,避免忘記。這個方法是我在網上查的,具體誰寫的忘記了,同樣在載入完成的方法裡。
- (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *string = [NSStringstringWithFormat:@"var script = document.createElement('script');" "script.type = 'text/javascript';" "script.text = \"function ResizeImages() { " "var myimg,oldwidth,oldheight;" "var maxwidth=%f;"/** 此處為縮放係數*/ "for(i=0;i <document.images.length;i++){" "myimg = document.images[i];" "if(myimg.width > maxwidth){" "oldwidth = myimg.width;" "myimg.width = maxwidth;" "oldheight = myimg.height" "myimg.height = oldheight * (maxwidth/oldwidth);" "}" "}" "}\";" "document.getElementsByTagName('head')[0].appendChild(script);",SCREEN_WIDTH -30 * WIDTH_SCALE]; [webView stringByEvaluatingJavaScriptFromString:string]; [webView stringByEvaluatingJavaScriptFromString:@"ResizeImages()"]; /** 獲取頁面高度*/ NSString *offsetHeightStirng = [webViewstringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"]; CGFloat offsetHeight = [offsetHeightStirngfloatValue]; /** 設定到 WebView 上*/ webView.frame =CGRectMake(0,0,self.view.frame.size.width, offsetHeight); /** 獲取WebView最佳尺寸*/ CGSize frame = [webViewsizeThatFits:webView.frame.size]; /** 獲取內容實際高度*/ NSString *heightString = [webViewstringByEvaluatingJavaScriptFromString: @"document.getElementById('webview_content_wrapper').offsetHeight + parseInt(window.getComputedStyle(document.getElementsByTagName('body')[0]).getPropertyValue('margin-top')) + parseInt(window.getComputedStyle(document.getElementsByTagName('body')[0]).getPropertyValue('margin-bottom'))"]; CGFloat height = [heightStringfloatValue]; /**內容實際高度 和 畫素的比*/ height = height * frame.height / offsetHeight; /** 重新設定 WebView 高度 */ webView.frame = CGRectMake(0, 0, self.view.frame.size.width,height) NSLog(@"webView.frame = %@",NSStringFromCGRect(webView.frame)); }
另外提供一種UIWebView不太靠譜的一種方法,為什麼說不太靠譜呢?是因為提供這個方法的人,說這個方法是可以的獲取到webview高度的,但是我在使用過程中,並沒有什麼卵用,但是呢,也提供出來吧,可能是我用的方法不對呢,這誰知道呢。。。同樣,在介面載入完成時
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
CGSize actualSize = [webViewsizeThatFits:CGSizeZero];
CGRect newFrame = webView.frame;
newFrame.size.height = actualSize.height;
webView.frame = newFrame;
}
///////////////////////////////////// 萬惡的分割線 ////////////////////////////////////////// 在使用ECharts過程中,我們要將webview高度,作為引數,傳遞給html,但是html設定的高度,居然是 int 型別,沒錯,就是int型別,導致我們這邊必須傳入整數。開始我們並不知道這個事情,所以傳入的是計算後的比例值,這個比例值是個保留小數點後兩位的 float 型別,這就導致了,此時展示的webview尺寸,不是我傳入的尺寸,而是前端寫的預設值。導致圖表高度展示不全。