71

この質問UITableViewへの回答で説明されているように、高さが可変の行を作成しようとしています

私の問題は、各セルに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;
    }

セル自体は nib からロードされます。これは単に aUITableViewCellを含むUIWebViewです。(可変の高さの方が適切ですが、セルが html コンテンツの最大値に合わせて調整されている場合も問題ありません)。

4

7 に答える 7

77

このコードは、テーブル ビューで使用するには遅すぎる可能性がありますが、問題はありません。UIWebView は DOM への直接アクセスを提供しないため、代替手段はないようです。

ビューコントローラーviewDidLoadでは、webview に HTML をロードし、ロードが完了したら、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);
}
于 2009-04-15T11:41:26.737 に答える
28

私はあなたの答えを見つけてとてもうれしく思いました.javascriptのトリックはうまくいきました.

ただし、「sizeThatFits:」メソッドもあります。

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

ゼロ以外の優先サイズを設定する必要がありますが、それ以外は通常常に機能します。

通常、UIWebViews を使用すると、2 回目の読み込みでのみ機能するように見えます (「loadHTMLString:」メソッドを使用し、デリゲートの「didFinishLoad:」メソッドから「sizeThatFits:」を呼び出します)。

ですから、どのような場合でも機能するソリューションを見つけることができてとてもうれしかったです。

于 2009-06-06T13:09:51.403 に答える
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 を返す必要があります。

于 2009-08-06T23:26:30.090 に答える
4

より良いアプローチはscrollView.contentSize.height、以下のようにプロパティを使用することです。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     NSLog(@"%f",webView.scrollView.contentSize.height);   
}
于 2015-08-29T23:43:18.037 に答える
4

問題-sizeThatFits:は、少なくとも iOS 4.1 では動作しないことです。webView の現在のサイズを返すだけです (CGSizeZero で呼び出されたか、ゼロ以外の任意のサイズで呼び出されたかに関係なく)。

を呼び出す前に webView のフレームの高さを減らすと、実際に機能することがわかりました-sizeThatFits:

私の解決策を参照してください: UIWebViewのコンテンツサイズを決定する方法は?

于 2010-10-14T21:13:23.230 に答える
3

Webビューの測定は機能しますが、コンテンツが読み込まれた場合にのみ機能します

  • Webビューを小さくする(5pxなど)
  • それをロードし、終了を待ちます
  • 次にsizeToFitを呼び出します
  • サイズを取得する
  • テーブルビューをリロードします(セルの正しい高さを返します)

広告::Dこれに苦労しているgithubのM42WebviewTableViewCellクラスを参照してください

于 2012-11-24T11:01:02.737 に答える
3

sizeThatFits の値が初めてで、その後ではない場合、考えられる原因として、外部 CSS のバグが考えられます。外部 CSS が取得され、Web ドキュメントが完全に構築される前に、すぐに webViewDidFinisLoad が呼び出されるようです。キャッシュがあるのでリロードすればバグはなくなると思います。

トリック : アプリケーションですぐにダミーの UIWebView を使用して CSS をプリロードします。

SDK : IOS4

于 2010-08-09T12:31:24.080 に答える