iOS日常開發(fā)過程中經(jīng)常遇到web嵌套到tableview的場(chǎng)景,這時(shí)候webView的高度計(jì)算顯得很重要。
日常使用姿勢(shì)如下在webViewDidFinishLoad:方法中,通過JS注入方法獲取web的高度:
NSString * clientheight_str = [webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight;"];
float height = [clientheight_str floatValue];
細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),使用如上方法計(jì)算高度時(shí),有時(shí)候會(huì)出現(xiàn)網(wǎng)頁顯示不全的現(xiàn)象,也就是計(jì)算實(shí)際高度不對(duì)。
學(xué)過h5的同學(xué)都知道,上述的高度取的是網(wǎng)頁<body><body>(網(wǎng)頁內(nèi)容)的高度,但并不是實(shí)際在webView中渲染出來之后的高度,所以要獲取實(shí)際真實(shí)高度需要多一步操作,如下:
//獲取頁面高度(像素)
NSString * clientheight_str = [webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight;"];
float clientheight = [clientheight_str floatValue];
//設(shè)置到WebView上
webView.frame = CGRectMake(0, 0, ScreenWidth, clientheight);
//獲取WebView最佳尺寸(點(diǎn))
CGSize frame = [webView sizeThatFits:webView.frame.size];
//獲取內(nèi)容實(shí)際高度(像素)
NSString * height_str= [webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight;"];
float height = [height_str floatValue];
// //內(nèi)容實(shí)際高度(像素)* 點(diǎn)和像素的比
height = height * frame.height / clientheight;
第一次獲取高度并不是真正下是之后的高度,第二次獲取的height_str才是真正webView實(shí)際顯示之后的高度,代碼的第三行設(shè)置webView的frame非常重要,相當(dāng)于對(duì)內(nèi)容的一次渲染,之后去獲取才是webView顯示之后的真正高度。調(diào)試斷點(diǎn)截圖如下:

xcode控制臺(tái).png
可以看到兩次獲取body的高度不一致,第二次為實(shí)際渲染后webView的內(nèi)容高度
webView實(shí)際使用中,高度計(jì)算可能受到body設(shè)置的padding和margin有關(guān)參數(shù)的影響,情況具體分析。