可変の高さのカスタムテーブルセルを使用してUITableViewを作成しています。その高さは、含まれている複数行のUILabelのサイズによって決まります。デリゲートメソッドを接続し、を使用してtableView:heightForRowAtIndexPath:
最終的な高さを正しく計算しましたsizeWithFont:constrainedToSize:
。
奇妙な問題に遭遇しました。データソースメソッドtableView:cellForRowAtIndexPath:
が呼び出されるまでに、行ごとの正しい高さは上記のようにすでに決定されていますが、セルのフレームがその高さと一致していません。代わりに、frame.size.height
セルのプロパティは、高さではなく、テーブルビューのデフォルトのセルの高さ(86 px、Interface Builderで設定したように、含まれているUILabelにテキストが1行しかない場合の正しい高さ)です。そのtableView:heightForRowAtIndexPath:
インデックスパスに対して正しいと判断されました。
私はcellForRowAtIndexPath:
デキューを使用してセルを生成しています。つまり、
// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel
したがって、iOSが舞台裏で何をしていても、デキューはセルのフレームプロパティを計算された高さに一致するように設定していないようです。これ自体はそれほど驚くべきことではなく、デキューはセルインスタンスのジオメトリではなく、セルインスタンスに関係します。ただし、セルは正しくレンダリングされるため、heightプロパティはどこかに設定されていますが、その後に発生しcellForRowAtIndexPath:
ます。
つまり、最初にテーブルビューにデータを入力するcell.frame.size.height
と、リストを下にスクロールしたときに初めて表示されるすべてのセルで86になります。正しいジオメトリは、cellForRowAtIndexPath:
表示される前に各行の最初の後に設定されるため、上にスクロールすると、再利用後に表示される各セルの高さプロパティが正しくなります。
この後、テーブルビューを自由に前後にスクロールでき、その時点以降、各セルの高さプロパティは正しいままです。
デキューベースの再利用が発生する前に、最初に正しいセルの高さを取得する正しい方法は何ですか?テーブルセルのサブビューの位置を少し変更するには、これが必要です。手動で呼び出してから、新しく作成したCustomCellインスタンスのフレームをその高さに一致するように手動で設定する必要がありheightForRowAtIndexPath:
ますcellForRowAtIndexPath:
か?これは冗長に思えます。この冗長性を回避するために、セルが間違ったフレーム高で初めて作成されたときと、後で正しいフレーム高でデキューされたときを検出するメカニズムを作成する必要があります。
ですから、誰かがこの背後にある論理に光を当てることができれば、私はそれを感謝します。