Как получить размер представления контента UITableView? - PullRequest
16 голосов
/ 28 июля 2011

Я хотел бы получить размер представления содержимого UITableView при заполнении таблицы. Любые предложения о том, как это сделать?

Ответы [ 4 ]

61 голосов
/ 28 июля 2011
// Allows you to perform layout before the drawing cycle happens. 
//-layoutIfNeeded forces layout early. So it will correctly return the size. 
// Like dreaming before doing.

[tableView layoutIfNeeded];


CGSize tableViewSize=tableView.contentSize;
5 голосов
/ 30 декабря 2011

Вот полезный метод, который делает это трудным путем. Незначительным преимуществом является то, что нет необходимости звонить [tableView layoutIfNeeded].

#define CGSizesMaxWidth(sz1, sz2)             MAX((sz1).width, (sz2).width)
#define CGSizesAddHeights(sz1, sz2)           (sz1).height + (sz2).height

+ (CGSize)sizeForTableView:(UITableView *)tableView {
    CGSize tableViewSize = CGSizeMake(0, 0);
    NSInteger numberOfSections = [tableView numberOfSections];
    for (NSInteger section = 0; section < numberOfSections; section++) {
        // Factor in the size of the section header
        CGRect rect = [tableView rectForHeaderInSection:section];
        tableViewSize = CGSizeMake(CGSizesMaxWidth(tableViewSize, rect.size), CGSizesAddHeights(tableViewSize, rect.size));

        // Factor in the size of the section
        rect = [tableView rectForSection:section];
        tableViewSize = CGSizeMake(CGSizesMaxWidth(tableViewSize, rect.size), CGSizesAddHeights(tableViewSize, rect.size));

        // Factor in the size of the footer
        rect = [tableView rectForFooterInSection:section];
        tableViewSize = CGSizeMake(CGSizesMaxWidth(tableViewSize, rect.size), CGSizesAddHeights(tableViewSize, rect.size));
    }
    return tableViewSize;
}
2 голосов
/ 01 февраля 2018

Я не знаю, насколько людям понравится этот ответ, потому что я не уверен, что он мне нравится. Но мне удалось заставить что-то работать с этим.

Это будет работать для ячеек с динамической высотой. Обратный вызов будет вызываться несколько раз, так как таблица просматривает свой контентView

class ContentSizeNotifyingTableView: UITableView {
    var contentSizeDidChange: ((CGSize) -> ())?

    override var contentSize: CGSize {
        didSet {
          self.contentSizeDidChange?(self.contentSize)
        }
    }
}
1 голос
/ 14 августа 2016

Для табличных представлений, высота которых динамически измеряется содержимым их ячеек -

My tableView содержится в UIView, чья функция updateConstraints() выглядит следующим образом:

override func updateConstraints() {
    self.tableView.layoutIfNeeded()
    self.tableViewHeight.constant = min(300, self.tableView.contentSize.height)
    super.updateConstraints()
}

tableViewHeight - это IBOutlet для высоты, назначенной XIB представления таблицы.Я получаю в зависимости от того, что меньше - 300 точек или высота размера содержимого табличного представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...