TableView contentSize не обновляется своевременно для systemLayoutSizeFitting - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать 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, и он в конечном итоге возвращает правильный размер, но не достаточно быстро.

Есть идеи, как мне обойти эту проблему?

...