Как отобразить заданное количество строк в маленьком табличном представлении с ячейками с саморазмерным размером - PullRequest
0 голосов
/ 04 марта 2019

У меня есть пользовательский класс табличного представления, который настроен для установки высоты табличного представления для отображения только 3 строк.Это означает, что если имеется 20 строк, размер таблицы будет отображаться так, чтобы отображались первые 3 строки, и позволяла пользователю прокручивать.

Этот мой код работает, только если я установил статический rowHeight

class CannedRepliesTableView: UITableView {

    /// The max visible rows visible in the autocomplete table before the user has to scroll throught them
    let maxVisibleRows = 3

    open override var intrinsicContentSize: CGSize {

        let rows = numberOfRows(inSection: 0) < maxVisibleRows ? numberOfRows(inSection: 0) : maxVisibleRows
        return CGSize(width: super.intrinsicContentSize.width, height: (CGFloat(rows) * rowHeight))
    }
}

Если я установлю UITableViewAutomaticDimension на rowHeight, размер таблицы будет изменен неправильно.Есть ли решение для этого?

1 Ответ

0 голосов
/ 05 марта 2019

Это был бы один из способов улучшить то, что у вас сейчас есть.У меня нет опыта доступа к intrinsicContentSize для этих вычислений и я не проверял это локально (кроме синтаксиса), но если раньше это работало, это также должно быть.

В основном вы создаете массивс maxVisibleRows числом indexPaths .Если у вас меньше, fetchedIndexesCount предотвращает сбой indexOutOfBounds .Получив массив, вы выполняете итерацию для каждой соответствующей ячейки и извлекаете ее размер, в итоге суммируя его.

class CannedRepliesTableView: UITableView {

    var focussedSection = 0
    let maxVisibleRows = 3

    open override var intrinsicContentSize: CGSize {
        return CGSize(width: super.intrinsicContentSize.width, height: calculateHeight())
    }

    private func calculateHeight() -> CGFloat {
        guard let indexPaths = startIndexes(firstCount: 3) else {
            // Your table view doesn't have any rows. Feel free to return a non optional and remove this check if confident there's always at least a row
            return 0
        }
        return indexPaths.compactMap({ cellForRow(at: $0)?.intrinsicContentSize.height }).reduce(0, +)
    }

    private func startIndexes(firstCount x: Int) -> [IndexPath]? {
        let rowsCount = numberOfRows(inSection: focussedSection)
        let fetchedIndexesCount = min(x, rowsCount)
        guard fetchedIndexesCount > 0 else {
            return nil
        }
        var result = [IndexPath]()
        for i in 0..<fetchedIndexesCount {
            result.append(IndexPath(row: i, section: focussedSection))
        }
        return result
    }
}
...