天天看點

UIWebView根據内容自适應高度

一、webView通過内容擷取高度的幾個方法:

1、通過webview自帶的自适應方法:

CGSize size = [_webView sizeThatFits:CGSizeZero];
    CGFloat webViewHeight = size.height;
           

2、通過webView可滾動的範圍擷取高度

CGFloat webViewHeight = [_webView.scrollView contentSize].height;
           

3、通過JS擷取高度

CGFloat webViewHeight  = [[_webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
           

或:

CGFloat webViewHeight = [[_webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]floatValue];
           

4、還有一種是通過周遊webView的SubView拿到UIWebDocumentView的高度,親測不怎麼好使就不列舉出來了。

二、以上幾個方法會有一個問題,就是當網頁内文字特别少的時候高度未超過螢幕高度,以上方法會傳回螢幕的高度,而不是具體内容高度,解決辦法如下:

首先先判斷通過以上方法擷取的高度是否大于螢幕高度,如果未超過螢幕高度,則通過計算文本高度來擷取網頁高度。

-(float)heightOfWebView:(UIWebView*)webView{
    float realWebHeight = 0.0f;
    CGFloat textHeight = [self webContentTextHeightOfWebView:webView];
    NSLog(@"文本高度是:%f",textHeight)
    ;
    CGSize size = [webView sizeThatFits:CGSizeZero];
    NSLog(@"size.height = %f",size.height);
    if (size.height > ScreenHeight*0.5f) {
        realWebHeight = size.height;
    }else
    {
        realWebHeight = textHeight;
    }
    return realWebHeight;
}
           
//通過字型的高度來擷取網頁高度
-(CGFloat)webContentTextHeightOfWebView:(UIWebView*)webView
{
    NSMutableString* mutableDetailStr = [[NSMutableString alloc] initWithString:_webHtmlString];
    [mutableDetailStr replaceOccurrencesOfString:@"<br/>" withString:@"\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableDetailStr length])];
    [mutableDetailStr replaceOccurrencesOfString:@" " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableDetailStr length])];
    [mutableDetailStr replaceOccurrencesOfString:@"div" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableDetailStr length])];
    CGSize size = CGSizeMake(_newsWeb.bounds.size.width, MAXFLOAT); //設定一個行高上限
    NSDictionary *attribute = @{NSFontAttributeName:[UIFont systemFontOfSize:17]};
    CGSize textSize = [mutableDetailStr boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attribute context:nil].size;
    return textSize.height - 50;
}