UITableView внутри UICollectionViewCell: развернуть до полного размера - PullRequest
4 голосов
/ 27 мая 2020

Я ищу подход к реализации макета, как показано ниже:

layout example

По сути, он состоит из UICollectionViewCell с экземпляр UITableView внутри него. UICollectionViewCell содержит несколько других дополнительных элементов, но они не имеют отношения к этому вопросу.

Я бы хотел, чтобы UITableView был полностью развернут, то есть показывал все ячейки. Я выбрал UITableView, потому что он имеет именно тот стиль, который мне нужен.

Проблема в том, что UITableView не раскрывается полностью. С технической точки зрения, я бы хотел, чтобы размер UITableView был равен его contentSize.

Я использую AutoLayout для вычисления UICollectionViewCell размера, поэтому UITableView с изменяемым размером может пригодиться.

До сих пор я пробовал использовать этот подход:

import UIKit

final class FullSizeTableView: UITableView {
    override var intrinsicContentSize: CGSize {
        return contentSize
    }
}

А затем используя FullSizeTableView в UICollectionViewCell: enter image description here

Я ограничил UITableView со всех 4 сторон, сверху до UIStackView и снизу, слева и справа до ContentView.

Однако результат выглядит так:

incorrect result

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4 /// Meanwhile, Returning 4 rows in the DataSource
    }

Итак, я полагаю, AutoLayout, похоже, не учитывает фактический размер UITableView . Какие могут быть потенциальные подводные камни, которые я не учитываю?

Моя цель для UITableView - всегда полностью раскрывать и отображать в полном размере.

Обновление1:

Прокрутка уже отключена enter image description here

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Вы можете рассчитать высоту каждой строки и установить высоту tableView равной ее сумме.

Вот простая функция, которая должна это делать (не тестировал ее, поэтому могут потребоваться некоторые настройки) :

func calculateTableViewContentHeight(tableView: UITableView) -> CGFloat {
    let rows = tableView.numberOfRows(inSection: 0) // adapte to your needs
    var totalHeight: CGFloat = 0
    for i in 0..<rows {
        totalHeight += tableView.rectForRow(at: IndexPath(row: i, section: 0)).height
    }
    return totalHeight
}
2 голосов
/ 27 мая 2020

Попробуйте использовать это -

class ContentSizedTableView: UITableView {
override var contentSize: CGSize {
    didSet{
        self.invalidateIntrinsicContentSize()
    }
}

override var intrinsicContentSize: CGSize {
    self.layoutIfNeeded()
    return contentSize
}

override func reloadData() {
    super.reloadData()
    invalidateIntrinsicContentSize()
    layoutIfNeeded()
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...