2011-06-20 11 views
1

現在、他の要素の中でもUIWebViewをカスタムUITableViewCellサブクラスにネストしようとしています。動的高さと読み込みアニメーションを持つUIWebViewCellを保持するUITableViewCell

私は動的にセルのサイズを決定する必要が

(heightForRowAtIndexPathを使用して)が、私はそうのようにそれを行う何らかの理由で、高さは常に0として印刷されます:

UIWebView* wv = [[[UIWebView alloc] init] autorelease]; 
[wv loadHTMLString:body baseURL:nil]; 
[wv setNeedsLayout]; //I don't think these are necessary but I tried anyway. 
[wv setNeedsDisplay]; 
CGSize wvSize = [wv sizeThatFits:webViewBounds]; 
NSLog(@"WVHEIGHT %f", wvSize.height); //THIS IS WHERE IT PRINTS. 
CGFloat retVal = 10.0f; 
retVal += 50 > wvSize.height ? 50 : wvSize.height; 
retVal += 2 + 15 + 10; 

return retVal; 

さて、私はそれを行う場合私がcellForRowAtIndexPathにアクセスできるcell.webViewを使って正確に同じ計算をすると、ゼロ以外の値が返されます。しかし、私は本当にどのくらいの高さを把握するために、セル全体を読み込まないようにしたいと思います...

さらに、UIWebViewはテキストをレンダリングするのが非常に遅いです(残念ながら、私はUIWebViewを使用していません)それで、テキストが完全にロードされてレンダリングされるまで、典型的なアップルの「回転ギア」アクティビティアイコンを表示する方法があるかどうかは疑問でした。

+0

'webViewBounds'はどこに定義されていますか? – PengOne

答えて

3

読み込みが完了して読み込みインジケータが表示されるまで、各UIWebViewを非表示にすることをお勧めします。次に、タグに一致するキーで辞書を作成し、辞書の各エントリについて、UIWebViewのサイズを格納します。

あなたのコントローラは、次のコードをUIWebViewDelegateプロトコルに準拠し、使用してください:その後

- (void)webViewDidFinishLoad:(UIWebView *)webView { 

    NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('this').offsetHeight;"]; 

    [self.webViewHeights setValue:[output floatValue] forKey:[NSString stringWithFormat:@"%f", webView.tag]]; 

} 

、あなたのロードビューを隠し、あなたのUIWebViewを表示し、テーブルのリロードを呼び出すためのコードを追加します。セル高さの方法では、UIWebViewの高さに適した配列要素を確認してください。

編集:

私は重要な部分を省いたようです!

いいえ、見えないUIWebViewを作成するには、作成する必要がありますが、実際にはビューに追加する必要はありません。たとえば、あなたがviewDidLoad方法でこのような何かを行うことができます:あなたが使用したいものである:あなたのテーブルのコードで次に

UIWebView *newWebView = [[UIWebView alloc] initWithFrame:newFrame]; 
[newWebView loadHTMLString:body baseURL:nil]; 
newWebView.tag = 1; 

[self.webViewDictionary setObject:newWebView forKey:@"1"]; 

を、私はsizeThatFitsにはないと思う

NSString *tagString = [NSString stringWithFormat:@"%d", indexPath.row]; 
UIWebView *curWebView = [self.webViewDictionary objectForKey:tagString]; 

if (curWebView.loading == NO) { 

    CGRect newFrame = curWebView.frame; 
    newFrame.size.height = [self.webViewHeights objectForKey:tagString]; 
    curWebView.frame = newFrame; 

    [cell addSubview:curWebView]; 

} else { 

    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorStyleGray]; 

    [cell addSubview:activityIndicator]; 

} 
+0

「ロードが完了するまで各UIWebViewを非表示にすることをお勧めします。この質問を書いている点は、私はそれをどうやって行うのかわからないということでした... – TigerTrussell

+0

OK、私は精緻化します。 – Katfish

0

ような何かを言います。

sizeThatFits:

は最高のサブビューに合う サイズを計算して返すようにビューを要求します。

あなたのwebviewには、HTMLのみのサブビューはありません。

UIWebViewには独自のinitメソッドがありません。そのため、サイズを直接設定するためにinitWithFrame:(UIViewスーパークラスから)を使用することをお勧めします。このサイズは、この場合のtableViewセルのサイズです。

+0

私は最初のフレームにそれを設定しようとしましたが、その後 "sizeToFit"と呼ばれていましたが、それもうまくいかなかったのです。これは本当にはるかに簡単になるはずです... – TigerTrussell

関連する問題