5

さて、私はこの質問が尋ねられ、尋ねられたことを知っています。多くの良い提案がありますが、これを期待どおりに機能させることはできません。さまざまな html に基づいて、負荷時に高さを動的に設定できるテーブルビュー セルを作成しようとしています。誰もが提案するのは、次の方法を使用することです。

-(void)webViewDidFinishLoad:(UIWebView *)webView 

彼らは、以下のようにjavascriptを使用して高さを計算すると言います:

NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"]; 

または、次のようなことを行います(私はこれを作成しました):

self.webView = webView;
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;

これらのメソッドはどちらも Web ビューの正しい高さを返しますが、テーブルビューが初期化された後に発生します。この webViewDidFinishLoad は、heightForRowAtIndexPath メソッドの後に呼び出されます。したがって、テーブルが作成されているとき、セルの高さはありません。それで、誰もがうまく言ったら、webViewDidFinishLoad内でテーブルビューのリロードを実行するだけでうまくいきますが、ラグがあり、その部分に到達するとテーブルビューのスクロールが途切れることになるため、私はこれが好きではありません. どうすればこれを修正できますか? そしてそれを滑らかにしますか?ビューをロードする前に、どうにかしてWebビューの高さを決定することを考えていましたが、どうすればよいかわかりません。また、html をプレーン テキスト文字列に変換しようとしましたが、html にはスペースなどが含まれているのにプレーン テキストには含まれていないため、高さが正しくありません。どんな助けでも大歓迎です!

4

3 に答える 3

3

私の提案は、Webビューを画面外にレンダリングすることで、@Timothy Mooseに非常に似ています。

ここで私が取るアプローチは...

-(void)viewDidLoad
{
     //Create a UIWebView and store it in a property
     //Hook the delegate to the view controller.
     //Load the html string to the UIWebView.

     //The rest of your initialization
}

この場合、heightForRowAtIndexPath:Web ビューが完了する前に will が呼び出される可能性があります。

いくつかの方法でそれを処理できます。ここに 1 つの提案があります。

UIWebView のデリゲート メソッドでwebViewDidFinishLoading、呼び出しを行う WebView がプロパティに保存されている WebView であることを確認します。その場合は、Web ビューが含まれているセクション (または行) をリロードするために呼び出します。これによりheightForRowAtIndexPath:、再度呼び出されるメソッドが呼び出されます。この場合、Web ビューの高さをwebViewDidFinishLoadingコールバックに格納できます。

ビューが最初に表示されたときにセルが画面外にある場合、 で作成されたセルには、 で作成した が含まれているcellForRowAtIndexPath:必要がありUIWebViewますviewDidLoadUIWebViewこれを行うには、セルのコンテンツ ビューに を追加します。

ビューが最初に表示されたときにセルが画面に表示されている場合は、最初にセルが読み込まれたときにアクティビティスピナーを提案し、webview の読み込みが完了したら、webview でセルをリロードします。

于 2013-05-24T19:42:28.870 に答える
0

あなたの場合、tableviewcellにwebviewがあるので、heightForRowAtIndexPathで、次のようにセルの高さをNSAttributedStringサイズの高さに設定します。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{


    NSAttributedString *attributedText = [NSString  getHTMLAttributedString:@"HTML Content"];
    CGSize size = CGSizeMake(300, CGFLOAT_MAX);
    CGRect paragraphRect =     [attributedText boundingRectWithSize:size
                                 options:(NSStringDrawingUsesLineFragmentOrigin)
                                 context:nil];
    return paragraphRect.size.height;
}

+(NSAttributedString *) getHTMLAttributedString:(NSString *) string{
    NSError *errorFees=nil;
    NSString *sourceFees = [NSString stringWithFormat:
                            @"<span style=\"font-family: 'Roboto-Light';font-size: 14px\">%@</span>",string];
    NSMutableAttributedString* strFees = [[NSMutableAttributedString alloc] initWithData:[sourceFees dataUsingEncoding:NSUTF8StringEncoding]
                                                                                 options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                                           NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]}
                                                                      documentAttributes:nil error:&errorFees];
    return strFees;

}
于 2015-11-04T06:04:02.803 に答える