2016-03-15 20 views
6

私はUITableViewのコンテンツサイズを計算したいと思います。私は高さUITableViewAutomaticDimensionのautolayoutを使用しています。自動レイアウトを使用しているときのコンテンツサイズUITableView

テーブルビューをリロードした後に[UITableView contentsize]を取得しようとしました。この場合、高さはestimatedRowHeightに基づいて計算されます。

self.tableView.estimatedRowHeight = 50; 
self.tableView.rowHeight = UITableViewAutomaticDimension; 

委任 -

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return UITableViewAutomaticDimension; 
} 

コンテンツのサイズを取得し、高さ制約に割り当てしようとしています。

[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

前もって感謝します。

編集:

は最後に、私はいくつかの微調整と私の問題を解決しています。私はtableviewの高さをmax(私の場合300は最大)に変更してからテーブルにデータをリロードしたので、tableviewにはすべてのセルのサイズを変更するスペースがあります。

self.tableHeightConstraint.constant = 300; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

ありがとうございました。

+0

問題を詳細に説明できますか? –

+0

tableviewのcontentsizeが必要です。私はcontentsizeに関してtableviewとsuperviewフレームを変更することができます。私はautolayoutとUITableViewAutomaticDimensionを使用しています。それは正確に動作していません。 – OMK

+0

'Autolayout'を使用している場合、フレームを変更することはできません。 'NSLayoutContraints'で遊ぶ必要があります。 –

答えて

7

最後に、私はいくつかの微調整で私の問題を解決しました。私はtableviewの高さをmax(私の場合300は最大)に変更してからテーブルにデータをリロードしたので、tableviewにはすべてのセルのサイズを変更するスペースがあります。

self.tableHeightConstraint.constant = 300; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

これを投稿すると、他のユーザーにとって役立ちます。

+0

このコードをどこで使うのですか? –

+0

あなたはどのように300が最大(または十分)かを知っていますか?私はscrollviewでtableviewを持って、tableviewはその内容の高さがあります。そして、私はテーブルビューに '([self.tableView numberOfRowInSection:0] - 1)* estimatedHeight'より大きい初期の高さを与えるべきであることを知ります。また、高さは 'viewWillLayoutSubviews'メソッドで設定しなければなりません。それはちょうどうまく動作していますが、私はその理由を伝えられません。 – ooops

+0

これは実際に動作します。 constraint.constantをmaxに設定しなければならない理由は分かりますか?それがなければ、これはうまくいかない。 –

5

最後に、私はあなたの問題を理解し、ここでその解決策です。

私はあなたが既にこれをしたことを望みます。

  1. 最初に取り付ける高さはUITableViewです。
  2. 次に、制限IBOutletUITableView高さにします。
  3. viewDidLayoutSubviewsメソッドでは、データを入力した後に元のUITableViewの高さを得ることができます。

更新以下のコード:

override func viewDidLayoutSubviews() { 

    constTableViewHeight.constant = tableView.contentSize.height 
} 

更新:

self.tableView.estimatedRowHeight = UITableViewAutomaticDimension。

これを確認してください。

+3

同じことをしました。働いていない。 tableView.contentSizeはestimatedRowHeightに基づいて計算されます。私はすべてのセルのサイズを変更した後に高さが必要です。 – OMK

+0

@OMK編集した回答を確認 –

+0

ありがとうございました。私が見つけた解決策で編集された質問。 – OMK

0

のtableViewが完全に再ロードした後、あなたは二つのこと、ちょうど遅延のいくつかの秒後方法下記

  1. コールを試すことができます。

    - (void)adjustHeightOfTableview 
    { 
        dispatch_async(dispatch_get_main_queue(), ^{ 
    
        [self.tableView reloadData]; 
    
        //In my case i had to call this method after some delay, because (i think) it will allow tableView to reload completely and then calculate the height required for itself. (This might be a workaround, but it worked for me) 
        [self performSelector:@selector(adjustHeightOfTableview) withObject:nil afterDelay:0.3]; 
        }); 
    } 
    
  2. あなたはちょうどそれを試してみるestimatedHeightForRow、

    /* 
    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
        return 44; 
    } 
    */ 
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
        return UITableViewAutomaticDimension; 
    } 
    

を返さないメソッドの上に呼び出すと、それはあなたが問題を得るのを助けることができます。

+0

ありがとうございました。私が見つけた解決策で編集された質問。 – OMK

+0

乾杯!ハッピーコーディング.. –

1

解決策は、私が表示しなければならなかったデータの可能性があると考えられるものより大きい値に設定することでした。

estimatedRowHeightプロパティがcontentSizeを特定するのに使用されなかったことが何らかの理由で保証されました。私はスクロールインジケータを表示しないので、estimatedRowHeightが途方に暮れていたことは本当に問題ではありませんでした。

関連する問題