UIWebView獲取網頁高度
> 方法一
根據webview內嵌的scrollView的contentSize.height去計算高度:
-(void)webViewDidFinishLoad:(UIWebView *)webView {
CGFloat height = 0.0;
[webView sizeToFit];
height = webView.scrollView.ContentSize.height;
CGRect webFrame = webView.frame;
webFrame.size.height = height;
webView.frame = webFrame;
}
> 方法二
-(void)webViewDidFinishLoad:(UIWebView *)webView {
CGFloat height = [[webView stringByEvaluatingJavascriptFromString:@"document.body.offsetHeight"] floatValue];
//ps:js可以是上面所寫,也可以是document.body.scrollHeight;個人覺得兩者在UIWebView中都可以,但是在WKWebView中就不同了,后面會有介紹
CGRect webFrame = webView.frame;
webFrame.size.height = height;
webView.frame = webFrame;
}
> 方法三:遍歷UIWebView的所有子視圖,找到中間的UIWebViewScrollView或者UIWebBrowserVeiw,獲取到它的frame設定給webView
-(void)webViewDidFinishLoad:(UIWebView *)webView {
if(webView.subViews.count > 0) {
for(UIView *view in webView.subViews) {
// if([view iskindOfClass:NSClassFromString:@"UIWebViewScrollView"]){
// webView.frame = view.frame;
// }
UIScrollView *scrollView = webView.subViews[0];
for (UIView *view in scrollView.subViews) {
if([view iskindOfClass:NSClassFromString:@"UIWebBrowserVeiw"]){
webView.frame = view.frame;
}
}
}
}
ps:經過驗證,以上三種方法都是可行的,但是會出現一個問題,有的時候依然獲取不到高度,或者高度不正確,這個時候有一個處理方法,是在didFinishLoad里面第一次獲取之后隔一到兩秒再獲取一次,就可以獲取到了,至于原因,我也不知道。
WKWebView獲取內容高度
> 方法一
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
CGFloat height = 0.0;
[webView sizeToFit];
height = webView.scrollView.ContentSize.height;
CGRect webFrame = webView.frame;
webFrame.size.height = height;
webView.frame = webFrame;
}
> 方法二
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
[webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id data, NSError * _Nullable error) {
CGFloat height = [data floatValue];
//ps:js可以是上面所寫,也可以是document.body.scrollHeight;在WKWebView中前者offsetHeight獲取自己加載的html片段,高度獲取是相對準確的,但是若是加載的是原網站內容,用這個獲取,會不準確,改用后者之后就可以正常顯示,這個情況是我嘗試了很多次方法才正常顯示的
CGRect webFrame = webView.frame;
webFrame.size.height = height;
webView.frame = webFrame;
}];
}
> 方法三:遍歷WKWebView的所有子視圖,找到中間的WKContentView,獲取到它的frame設定給webView
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
if(webView.subViews.count > 0) {
for(UIView *view in webView.subViews) {
if([view iskindOfClass:NSClassFromString:@"WKContentView"]){
webView.frame = view.frame;
}
}
ps:兩種webview的第三種方法需要自己打印出來webView.subViews去觀察一下,有很大不同,前兩種方法是比較常用的,一般情況下能滿足要求,特別一點是:我在做項目的時候發現,有時候第一次獲取高度是獲取不到的,這個時候我就強制在第一次獲取之后隔1s再去獲取一次,刷新webView,這個時候就能獲取到了
當然這只是我在做項目的過程中所遇到的問題,并多次嘗試解決的,也不一定適合所有的情況,若是有別的情況,或者有更多更好的方法歡迎交流學習