Я хотел бы получить размер представления содержимого UITableView при заполнении таблицы. Любые предложения о том, как это сделать?
Как получить размер представления содержимого UITableView?
Ответ 1
// 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;
Ответ 2
Здесь полезный метод, который делает это трудным путем. Незначительное преимущество в том, что нет необходимости вызывать [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;
}
Ответ 3
Для табличных представлений, высота которых динамически зависит от содержимого их ячеек -
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 пунктов или высота размера содержимого таблицы.
Ответ 4
Я не знаю, сколько людям понравится этот ответ, потому что я не уверен, что мне это нравится. Но мне удалось кое-что с этим поработать.
Это будет работать для динамических ячеек высоты. Обратный вызов будет вызван несколько раз, так как табличное представление показывает его contentView
class ContentSizeNotifyingTableView: UITableView {
var contentSizeDidChange: ((CGSize) -> ())?
override var contentSize: CGSize {
didSet {
self.contentSizeDidChange?(self.contentSize)
}
}
}