1. 程式人生 > >WebView使用 之 獲取 WebView 實際內容高度 及 其中一種導致WebView展示不全的bug

WebView使用 之 獲取 WebView 實際內容高度 及 其中一種導致WebView展示不全的bug

最近專案中,有一個模組,需要大量的圖表。而且產品明確表明,圖表只有一個要求,就是要好看,座椅使用原生控制元件,畫的話,費時費力不說,還不一定好看。所以呢,我們就用了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尺寸,不是我傳入的尺寸,而是前端寫的預設值。導致圖表高度展示不全。