針對獲取webView高度問題之前寫過一個方案——通過監聽WebView的scrollView的變化來實時更新高度 附上鍊接: iOS【終極方案】精準獲取webView內容高度,自適應高度
本文是給出第二種方案,解決網頁內大量圖片、動圖導致的內容高度獲取不準確: 直接上程式碼:
#pragma mark ————— 給每個Img標籤新增JS事件 —————
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *js = @"var imgs = document.getElementsByTagName(\"img\");"
"for(var i=0;i<imgs.length;i++){"
" var img = imgs[i];"
" img.onload=function(){window.location.href=('yourAppUrlSchemes://ImgLoaded');}"
"}";
//yourAppUrlSchemes 是在 info.plist - URL Types裡設定的當前URL Schemes
[webView stringByEvaluatingJavaScriptFromString:js];
}
#pragma mark =============== 攔截webview的請求,獲取網頁中最後一個可視元素的位置 ===============
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *urlString = [[request URL] absoluteString];
urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];
NSLog(@"urlString=%@---urlComps=%@",urlString,urlComps);
if (urlComps.count==2&&[urlComps[1] isEqualToString:@"ImgLoaded"]) {
//imgload 圖片載入完成,重新獲取高度
CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
//此處我獲取的是網頁中倒數第三個標籤的位置,可以根據要載入的網頁結構設定取倒數第幾個標籤的位置可以代表整個網頁高度
CGFloat lastHeight =[[_webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName(\"body\")[0].children[document.getElementsByTagName(\"body\")[0].children.length-3].offsetTop"] floatValue];
NSLog(@"webView:%@",NSStringFromCGSize(fittingSize));
_webView.frame = CGRectMake(0, 0, fittingSize.width, lastHeight);
[self.tableView beginUpdates];
[self.tableView setTableHeaderView:_webView];
[self.tableView endUpdates];
}
return YES;
}
複製程式碼
上述思路是通過給每個img標籤新增onload事件,事件執行內容就是給APP自身傳送通知,APP在shouldStartLoadWithRequest 回撥內截獲將要發出的請求,並重新計算網頁內容高度。
這是一個取巧的辦法,不夠靈活,實踐證明能夠解決固定結構的網頁高度獲取,對於不確定結構的網頁,建議不要使用此方法,容易有誤差。
大神們有解決這類問題的完美辦法還望及時聯絡我,為了幫到更多人~
以上屬於臭碼農原創,若有雷同屬巧合,如有錯誤望指正,轉載請標明來源和作者。 by:臭碼農