Я пытаюсь создать UITableViewController, где каждая ячейка содержит UITableView, который содержит еще несколько пользовательских ячеек.
Структура: MainTableView -> ContainerTableViewCell -> tableView -> ItemTableViewCell.
ItemTableViewCell имеет UIImageView и UILabel и размер не фиксированы, так как это зависит от длины текста.
Вот как я вычисляю размер ячейки:
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
self.layoutIfNeeded()
let minHeight: CGFloat = imageHeightConstraint.constant
var height = minHeight
let containerWidth = UIScreen.main.bounds.width - 20
let labelWidth = containerWidth - imageHeightConstraint.constant - 12 - 10 - 10
if let labelHeight = customLabel.text?.height(constraintedWidth: labelWidth, font: customLabel.font) {
height = max(labelHeight, minHeight)
}
return CGSize(width: targetSize.width - 20, height: height + topConstraint.constant + bottomConstraint.constant)
}
extension String {
func height(constraintedWidth width: CGFloat, font: UIFont) -> CGFloat {
let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: .greatestFiniteMagnitude))
label.numberOfLines = 0
label.text = self
label.font = font
label.sizeToFit()
return label.frame.height
}
}
Я также использую тот же метод в ContainerTableViewCell, чтобы предоставить окончательный размер ячейки контейнера.
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
tableView.layoutIfNeeded()
let contentSize = tableView.contentSize
let returnSize = CGSize(width: contentSize.width, height: contentSize.height + tableViewTopConstraint.constant + backGroundAreaTopConstraint.constant)
return returnSize
}
Проблема, с которой я сталкиваюсь, заключается в том, что tableView.contentSize.height вычисляется только частично при использовании в вышеуказанном методе, поэтому конечный размер ContainerTableViewCell неверен.
Я также пытался добавить наблюдателя в tableView.contentSize, и он в конечном итоге возвращает правильный размер, но не достаточно быстро.
Есть идеи, как мне обойти эту проблему?