7

私はUITableViewUITableViewAutomaticDimensionいくつか持っていestimatedRowHeightます。このテーブルUITableViewCellでは、いくつかのラベルを含むカスタムUIViewとオーバーライドされたカスタムを使用していますintrinsicContentSize()。制約の設定は正しく、テーブルは各行の実際の高さを決定できます。ここまでは順調ですね。

ここで、カスタムビューの内部ロジックを変更して、使用可能な幅に基づいて外観を調整し始めました。つまり、テーブルのセルサイズが十分に広くない場合、ビューは新しい制限に合わせてサブビューを再配置でき、これは結果の高さに影響を与えるため、次のようなコードがありますそれ:

var internalSize: CGSize = ...

override func intrinsicContentSize() -> CGSize {
    return internalSize
}

override func layoutSubviews() {
    super.layoutSubviews()
    fitIntoWidth(frame.size.width)
}

private func fitIntoWidth(width: CGFloat) {
    let height = // calculate based on content and width
    internalSize = CGSizeMake(width, height)
    invalidateIntrinsicContentSize()
}

ここで、テーブル ビューに入力すると、intrinsicContentSize()目的の値が返されますが、現在のレイアウトには適していません。その後layoutSubviews()、サイズが再計算され、システムが再度呼び出される場所に制御が移動し、intrinsicContentSize()適切な値が返されます。ただし、最初のテーブルではデータが読み込まれ、セルの高さは正しくない値に基づいて計算されintrinsicContentSize()ます。もう一度呼び出すreloadData()と、すべてが正常になり、テーブル内の今後のすべてのセルのレイアウトも問題ありません。

私の間違いはどこにあり、コードを変更して、セルのサイズ変更をreloadData()2 回呼び出すことなく正しく機能させる方法を教えてください。

4

0 に答える 0