8

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

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

ストーリーボードに接続されているUILabelプロパティを保持するだけのUITableViewCellのサブクラスがあります。ストーリーボードでは、行を0に設定して、必要な数の行を使用するようにし、lineBreakをワードラップに設定しました。

セルの設定方法は次のとおりです。

- (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の場合:テーブルビューでreloadDataを呼び出すと、セルとラベルが最初に正しく描画されます。このテーブルにセルを追加および削除するため、これは私の状況では機能しません。セルが追加されるたびにreloadDataを呼び出したくありません。

2番目の回避策は、私には非常に奇妙に思えます。フォント設定をUILabelのデフォルトのシステムフォント17のままにすると、セルは正しく描画されます。フォントサイズを変更するとすぐに、画面を離れて戻るか、tableViewでreloadDataが呼び出されるまで、ラベルを正しく描画しないという動作に戻ります。

これで助けていただければ幸いです。

4

3 に答える 3

8

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

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

最善の解決策かどうかはわかりませんが、今のところ機能しています。

于 2013-02-14T22:29:11.610 に答える
3

IBの[自動サイズ設定]チェックボックスをオフにすることで、これを解決することになりました。自動レイアウトがこの問題を引き起こした理由は不明です。

于 2013-11-27T05:35:07.687 に答える
3

私は同じ問題に遭遇し[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; }
于 2015-07-17T04:55:30.077 に答える