1. 程式人生 > >精確計算UIWebView內容的高度

精確計算UIWebView內容的高度

蒐集了網上各大部落格以及技術論壇,能夠獲取UIWebView的內容高度有以下兩個方法,相關程式碼如下:
方法一:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    //再設定高度
    CGRect frame = webView.frame;
    frame.size.height = 1;
    webView.frame = frame;
    CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
    frame.size = fittingSize;
    frame.origin
= CGPointMake(0, frame.origin.y); //frame.size.height就是內容高度了 }

方法二:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue];
    CGRect frame = webView.frame;
    frame.size.height
= webViewHeight; webView.frame = frame; }

然而,筆者在使用以上兩種方法的時候,都出現了第一次使用UIWebView的時候,高度算得不準的情況(基本上都是少一點),使得出現UIWebView中的文字被截斷的情況。原因是:viewDidFinishLoad方法只是在記憶體中載入完了html程式碼,然而並沒有渲染到UIWebView上面去,所以重新渲染後的真實高度和viewDidFinishLoad所獲取的高度有一定的偏差,所以我們應該在UIWebView渲染完後,再獲取高度,這時候才是最精確的。


其中JavaScript中有一個方法,可以在UIWebView渲染完畢html後執行,相關程式碼如下:

window.onload = function() { 
    //code
}

window.onload方法會在UIWebView渲染之後呼叫,所以我們可以在這個裡面寫一個url請求,把高度帶過去,然後在UIWebView的代理方法webView:shouldStartLoadWithRequest:navigationType:中攔截這個請求,獲取高度,這時候獲取的高度就是準確的了,JavaScript程式碼如下:

window.onload = function() { 
      window.location.href = "ready://" + document.body.scrollHeight;
}

代理方法程式碼如下:

- (BOOL)webView:(UIWebView*)webView 
  shouldStartLoadWithRequest:(NSURLRequest*)request 
  navigationType:(UIWebViewNavigationType)navigationType { 
  NSURL *url = [request URL]; 
  if (navigationType == UIWebViewNavigationTypeOther) { 
    if ([[url scheme] isEqualToString:@"ready"]) { 
      float contentHeight = [[url host] floatValue]; 
      CGRect fr = webview.frame; 
      fr.size = CGSizeMake(webview.frame.size.width, contentHeight); 
      webview.frame = fr; 
      return NO; 
    } 
  }
  return YES; 
}

PS:你可以把JavaScript程式碼放在你的html程式碼的前面或者後面

相關參考

相關推薦

精確計算UIWebView內容高度

蒐集了網上各大部落格以及技術論壇,能夠獲取UIWebView的內容高度有以下兩個方法,相關程式碼如下: 方法一: -(void)webViewDidFinishLoad:(UIWebView *)webView { //再設定高度 CGR

iOS計算UIWebView高度和iOS8之後的WKWebView的高度問題

當我們涉及到webView和純程式碼結合的時候,例如一個資訊詳情,其它位置想加上我們的純程式碼控制元件,可以計算出webView的高度,然後放到scrollView上,然後在scrollView下邊或者什麼位置,加上自己的純程式碼內容就行了. 下邊是計算UIWebVi

iOS 計算 UIWebView高度的問題

當我們涉及到webView和純程式碼結合的時候,例如一個資訊詳情,其它位置想加上我們的純程式碼控制元件,可以計算出webView的高度,然後放到scrollView上,然後在scrollView下邊或者什麼位置,加上自己的純程式碼內容就行了. 下邊是計算webView的高度

親測!最方便的計算UIWebView高度和iOS8之後的WKWebView的高度方法

UIWebView的高度計算方法:float webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:

計算 UIWebView內容高度

- (void)webViewDidFinishLoad:(UIWebView *)webView   {       NSString *height_str= [webView stringByEvaluatingJavaScriptFromString: @"do

iOS: 計算 UIWebView內容高度

先是 html 檔案內容 // index.html <html> <body> <div id="content" contenteditable="false" style="font-family: Helvetica"> <

計算UIWebView載入網頁的內容高度

計算高度我們總會遇到計算不準確的情況,而且載入網頁的時候儘量避免在block內部載入。至於為什麼暫時沒有找到完整的答案。 計算高度 無非就是在UIWebView的載入完成的代理裡面實現 有時候會出現計算偏差的問題 ,可以酌情加入迴圈獲取。將獲取的最新高度

使用boundingRectWithSize計算內容高度

NSDictionary *attributes = @{NSFontAttributeName:[UIFontsystemFontOfSize:16]}; CGRect comm_conte

iOS7,iOS8,iOS9 UIWebView獲取內容高度終極解決方案

場景 在 App 中載入網頁時,通常情況我們只需要直接初始化一個 WebView,然後去載入對應的 URL 即可,但若是有時候有些個設計是需要將 web 與原生的 UI 搭載在一起,一般情況下,webView 的 內容一頁是肯定不夠的,換句話說,webView 的高度是

IOS計算UIWebView的實際高度

UIWebView*_detailWebView=[[UIWebViewalloc]initWithFrame:CGRectMake(0,0, 320, 480)]; _detailWebV

JavaScirpt精確計算

ava blog rip math 計算 cti logs nbsp var JavaScript精確加法 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split("."

IOS7中動態計算UILable的高度

content tof 送別 lds %d bre 內心 大學生活 hsi .h文件 #import <UIKit/UIKit.h> @interface UILabel (ContentSize) - (CGSize)contentSize;

js獲取窗口滾動條高度、窗口可視範圍高度、文檔實際內容高度、滾動條離瀏覽器底部的高度

onscroll style pre span 文檔 log ner ons cti 1.獲取窗口可視範圍的高度 1 //獲取窗口可視範圍的高度 2 function getClientHeight(){ 3 var clientHeight=0;

iOS 【野路子】獲取WKWebView內容高度做H5原生連接

select cti ats 獲取頁面高度 attr cell 模式 posit length 前言:是這樣的,剛寫完上一篇文章還沒緩過神來,上一篇文章我還提到了,想和大家聊聊原生+H5如何無縫連接的故事.結果我朋友就給我發了兩篇他的作品.他的做法也都有獨到之處.好的文章都

基於Masonry自己主動計算cell的高度

markdown tracking 高度 ebo message cti nstimer timer uitable /** * This is a very

java根據生日精確計算年齡

dmi hda 日歷 tac day cat format oid trace 1 package getAge; 2 import java.text.SimpleDateFormat; 3 import java.util.Calendar; 4 import

JS根據身份證號碼精確計算年齡和性別

def user col .get || info fin ret 得到 1 /** 2 * 根據身份證號得到姓別和精確計算年齡 3 */ 4 function analyzeIDCard(IDCard){ 5 var sexAndAge = {};

js的精確計算

//加法函式,用來得到精確的加法結果 //javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函式返回較為精確的加法結果。 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toStrin

js精確計算

轉自:https://www.cnblogs.com/yadongliang/p/9067333.html 大多數語言在處理浮點數的時候都會遇到精度問題,但是在JS裡似乎特別嚴重,來看一個例子

使用計算類BigDecimal寫一個精確計算工具類

在日常開放當中需要我們計算數字,利率。通常Java的做法是使用Math相關的API。但是,這樣做是不夠精確的,由於float和double不能進行計算,如果強行進行計算會使得計算不準確。造成難以挽回的損失。為了彌補這一個缺點Java提供了BigDecimal這個類來解決。在使用這個類的時候需要將do