2013-05-24 14 views
5

さて、この質問が尋ねられ、尋ねられました。多くの良い提案がありますが、私はこれが期待どおりに動作するようにすることはできません。私は異なるHTMLに基づいて負荷時にその高さを動的に設定できるテーブルビューセルを作成しようとしています。皆が示唆していることは、次の方法を使うことです。可変高さ内の動的ローカルコンテンツに基づいてUIWebViewの高さを決定します。TableViewCell

-(void)webViewDidFinishLoad:(UIWebView *)webView 

彼らは高さを計算すると言うのいずれか、以下のようにJavaScriptを使用して:これらのメソッドの両方が返さ

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; 

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

それとも、この(私はこれを作成した)のようなものをやってWebviewの正確な高さですが、テーブルビューが初期化された後に発生します。このwebViewDidFinishLoadは、heightForRowAtIndexPathメソッドの後に呼び出されます。だから、テーブルが作られているとき、私はセルの高さを持っていません。だから誰もがうまく言って、あなたのwebViewDidFinishLoadの中でテーブルビューのリロードをやってみてください。これはもう一度動作しますが、遅れがあり、その部分に行くとテーブルビューのスクロールがスクロールしてしまいます。これをどうすれば解決できますか?それを滑らかにする?ビューを読み込む前にウェブビューの高さを何らかの形で判断することを考えていましたが、どうすればよいかわかりません。また、htmlをプレーンテキスト文字列に変換しようとしましたが、htmlには空白があり、プレーンテキストは含まれていないので、これは偽の高さになります。どんな助けもありがとう!

+1

heightForRowAtIndexPathが呼び出される前に終了する可能性があるので、Webビューをオフスクリーンで読み込めますか?また、ラグやチョップの性質を判断しましたか?おそらく、その問題を解決することができます。 –

+0

素晴らしいアイデア!これが私がやったことです。 – mikemike396

答えて

3

私の提案は@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表示が完了する前に呼び出されます。

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

UIWebViewのwebViewDidFinishLoadingのデリゲートメソッドで、呼び出しを行っているwebviewがプロパティに格納されているwebviewであることを確認してください。その場合は、あなたのwebviewが含まれているセクション(または行)を再読み込みするために呼び出します。heightForRowAtIndexPath:メソッドを呼び出して呼び出す必要があります。この場合、webViewDidFinishLoadingコールバックにwebviewの高さを格納できます。

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

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

+0

すばらしい答え!これはうまくいった唯一の解決策であるように思われました。画面からWebViewをロードし、高さを保存すると完璧に動作します。私が持っていた唯一の問題は、webForviewをcellForRowAtIndexメソッドの間にセルに追加することでした。 – mikemike396

4

Webviewのコンテンツが読み込まれるまでの高さを知ることはできません。そして、同じビットのコードがテーブルを設定してwebviewをロードしている場合、webviewはテーブルが既に表示された後に常にロードを完了します。

同じHTMLを繰り返し読み込むと、高さをキャッシュできますが、初めて問題が発生します。

のWebViewがロードされるまで、あなたが途切れ途切れされることなくスクロールテーブルビューを表示できるようにするつもりだ唯一の方法は、デフォルトのセルの高さを持つことです。次にそれを変更します。しかし、あなたはreloadを使用して、以下のことを試してみました。そしてそれは不安定でした。

しかし、どのようなセルの高さは、デフォルトの絶頂と真の高さの間でアニメーション化し、それについてはどうですか?多分それはより受け入れられるだろう。

あなただけの高さの変更をやっている場合は、私はサイズ変更をアニメーション化するためには、あなたがこれを行うのではなくリロードすることができると信じて。

[tableView beginUpdates]; 
[tableView endUpdates]; 

2行の間に何も必要ありません。

たぶん、あなたはそれがビューにユーザーがスクロール次回のためにHTMLの真の高さをキャッシュと組み合わせることができます。あなたのケースでは

+0

完璧!完璧。乾杯。! –

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; 

}