2013-01-22 22 views
8

UITableViewで動的行の高さを実装する際に問題が発生しますが、問題が発生しているセルではなく、セルの内部にあるUILabelです。動的高さを持つUITableViewCellのUILabel

セルには、テキストを表示するためのUILabelが含まれています。私のtableView:heightForRowAtIndexPath:NSStringのsizeWithFont:メソッドを使用するラベルの高さを計算して、各セルのサイズを正しく変更しています。

私は、ストーリーボードに接続されているUILabelプロパティを保持しているUITableViewCellのサブクラスを持っています。ストーリーボードでは、その行を0に設定して、必要な数の行を使用するようにしました。そして、その行をWord Wrapに設定しました。ここで

は、私はセルを設定してい方法です:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    SomeObject *object = self.tableObjects[index.row]; 

    cell.myLabel.text = [object cellText]; 

    [cell.myLabel sizeToFit]; 

    return cell; 
} 

私はこれをビルドすると、私はセルのすべてのコンテンツのための正しい高さにサイズ設定が、ラベルがすべてあると私のテーブルビューを取得します1行だけで細胞の側から流れ出る。しかし、テーブルをスクロールしてセルを画面から離れ、スクロールして戻すと、ラベルのサイズが正しく変更され、セルが最初にどのように見えるかが表示されます。

同じ方法でラベルのフレームを計算しようとしましたが、行の高さを計算していますが、同じ動作になります。画面からスクロールして再びオンになるまで、正しく描画されません。

私はこれを回避するには2つの方法を見つけましたが、いずれも解決策はありません。

最初に、viewDidAppearの場合:私はtableviewでreloadDataを呼び出すと、セルとラベルが最初に正しく描画されます。これは私の状況では動作しません。なぜなら、このテーブルにセルを追加したり削除したりするため、セルが追加されるたびにreloadDataを呼びたくないからです。

2番目の回避策は私にとっては非常に奇妙なようです。もしUILabelのデフォルトのSystem Font 17にフォント設定を残しておけば、セルは正しく描画されます。フォントサイズを変更すると、画面から離れて戻るか、tableViewでreloadDataが呼び出されるまで、ラベルを正しく描画しないという振る舞いに戻ります。

私はこのお手伝いをお待ちしております。

+0

この投稿は正しく、問題に答えます。http://stackoverflow.com/questions/8903369/dynamic- uitableviewcell-height。ダイナミックなサイズのセルを作成したことがない人は少し難しいかもしれませんが、それほど難しいことではありません。 – macandyp

+0

その答えのコードが、私がやっていることとは何か違うことをやっていることは、私は理解していません。私はcellForRowAtIndexPathに自分のラベルのフレームを設定していますが、次回の再描画までそのフレームを適用していません。または私は何かを逃していますか? – alivingston

+0

heightForRowAtIndexPathを実装していますか? – macandyp

答えて

8

私はcellForRowAtIndexPathでラベルをalloc/init'ingすることでこれを解決しました。なぜこれが解決策であるのか完全にはわかりませんが、私が経験していた問題は、ストーリーボード(または、おそらくいつ?)がセル内のオブジェクトを作成する方法と関係しているようです。 cellForRowAtIndexPath内のセルにラベルを割り当て/初期化すると、すべてがロードされ、サイズが正しくなります。

私の現在の修正点は、セルにカスタムラベルがあるかどうかを確認することです。そうでなければ、ラベルを割り当て/初期化してセルに入れます。デキューされているセルのように1つのセルがある場合は、すでに存在するラベルにテキストを設定します。

これが最良の解決策であるかどうかはわかりませんが、今はその解決策です。

+0

私は同様の問題が発生しました。私はtableView:cellForRowAtIndexPath:から[cell.myLabel sizeToFit]を削除して解決しました。そして、ストーリーボードを使用して、スーパービューにトップスペース、スーパービューにボトムスペースを追加します。 – jemeshsu

+0

あなたは私の時間を保存しました。ありがとうございました – NightFury

3

IBの自動サイズチェックボックスをオフにして解決しました。なぜ自動レイアウトがこの問題を引き起こしているのかは不明です。

2

は、私は同じ問題の上に走ったと私はセルに戻る前に[cell layoutIfNeeded]を呼び出すことによってそれを解決してしまう

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
SomeObject *object = self.tableObjects[index.row]; 

cell.myLabel.text = [object cellText]; 

[cell layoutIfNeeded]; 

return cell; } 
関連する問題