2009-04-13 84 views
70

我試圖創建一個可變高度行的UITableView作爲答案解釋this question如何根據內容在可變高度UITableView內確定UIWebView高度?

我的問題是每個單元包含一個UIWebView不同(靜態加載)的內容我無法弄清楚如何計算正確的基於內容的高度。有沒有辦法做到這一點?我已經試過這樣的事情:

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
     WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
     [cell setNeedsLayout]; 
     [cell layoutIfNeeded]; 
     return cell.bounds.size.height; 
    } 

自己是從筆尖,這簡直是含有UIWebView一個UITableViewCell加載的細胞。 (如果單元格將自己調整爲最大的html內容,雖然可變高度會更好)也是沒問題的。

+0

你有沒有想過如何做到這一點?下面的答案似乎讓你的高度,但直到你需要它之​​後。如何計算heightForRowAtIndexPath的高度是否必須依賴webViewDidFinishLoad中的回調(webview委託)調用? – pbx 2012-03-13 05:17:09

+0

嗨然後最後如何ü確定webview的高度我也有同樣的問題... – 2012-04-28 12:35:18

+0

任何人都有一個解決方案?仍然不知道這個.. – mikemike396 2013-05-24 18:11:11

回答

76

這段代碼對於表視圖的使用可能太慢了,但沒有辦法。它看起來沒有其他選擇,因爲UIWebView不提供對DOM的直接訪問。

在視圖控制器的viewDidLoad我加載了一些HTML在web視圖中,當加載完成後運行一些JavaScript返回元素的高度。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    webview.delegate = self; 
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"]; 
    NSLog(@"height: %@", output); 
} 
+0

聽起來像它可以使工作,但是我已經在表視圖中嘗試過,它返回一個空字符串(我猜是因爲webview沒有完成加載)。我想我可以預先計算一個離屏web視圖,並緩存tableview的結果。 – frankodwyer 2009-04-25 23:49:29

+0

你在測量webViewDidFinishLoad中的高度嗎?這是代表回調,指示加載完成。它不應該返回一個空字符串。 – duncanwilcox 2009-04-27 18:50:39

+0

這幾乎就是我所做的。雖然我有一個問題,即webview在加載完成之前無法返回它的大小,而當表需要知道它的大小時,它可能沒有。有沒有人有如何解決這個問題的想法? – 2010-06-14 13:49:06

28

我很高興找到你的答案,這個javascript技巧對我來說效果很好。

但是,我想說的話,有也是「sizeThatFits:」方法:

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)]; 

我們必須設置不同於零的首選大小,但除此之外,它通常總是工作!

通常,因爲使用UIWebViews,它似乎只適用於第二次加載(我使用「loadHTMLString:」方法,並且是從代理「didFinishLoad:」方法調用「sizeThatFits:」)。

所以,這就是爲什麼我很高興找到你的解決方案,無論如何工作。

6

這似乎工作。目前。

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    CGFloat webViewHeight = 0.0f; 
    if (self.subviews.count > 0) { 
     UIView *scrollerView = [self.subviews objectAtIndex:0]; 
     if (scrollerView.subviews.count > 0) { 
      UIView *webDocView = scrollerView.subviews.lastObject; 
      if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]]) 
       webViewHeight = webDocView.frame.size.height; 
     } 
    } 
} 

它應該安全地返回0,如果它失敗。

3

如果你第一次使用sizeThatFits的值不好,這裏是我遇到的一個可能的原因:一個外部CSS的錯誤。 似乎很快調用webViewDidFinisLoad,然後才能檢索外部CSS,並完全構建Web文檔。 我認爲如果您因緩存而重新加載,該錯誤​​消失。

一個小竅門:儘快在應用程序中預先加載一個虛擬的UIWebView。

SDK:IOS4

4

的問題-sizeThatFits:是,它不工作的開箱,至少不會在iOS 4.1。它只是返回webView的當前大小(不管它是用CGSizeZero調用還是任意的非零大小)。

我發現它實際上工作,如果你在調用-sizeThatFits:之前減小webView的幀高度。

見我的解決方案:How to determine the content size of a UIWebView?

3

測量的WebView工作,但只有當它加載其內容

  • 製作的WebView小(如爲5px)
  • 負載,並等待完成
  • 調用sizeToFit就可以了
  • 獲取大小THEN
  • 重新加載表格v IEW(返回單元格的正確高度)

廣告:d在Github上查看我的M42WebviewTableViewCell類,與此

2

更好的方法是使用scrollView.contentSize.height屬性,如下面的鬥爭。

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSLog(@"%f",webView.scrollView.contentSize.height); 
} 
相關問題