私はUITableView
とUITableViewAutomaticDimension
いくつか持ってい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 回呼び出すことなく正しく機能させる方法を教えてください。