我希望在填充表格时获得UITableView内容视图的大小。有关如何做到这一点的任何建议吗?
答案 0 :(得分:59)
// 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;
答案 1 :(得分:5)
这是一种实用方法,它很难实现。可以忽略的优势是无需拨打[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 :(得分:2)
我不知道有多少人会喜欢这个答案,因为我不确定我喜欢它。但我设法得到了一些有用的东西。
这适用于动态高度单元格。当tableview找出其contentView
时,回调将被调用几次class ContentSizeNotifyingTableView: UITableView {
var contentSizeDidChange: ((CGSize) -> ())?
override var contentSize: CGSize {
didSet {
self.contentSizeDidChange?(self.contentSize)
}
}
}
答案 3 :(得分:1)
对于高度按其单元格内容动态调整大小的表格视图 -
我的tableView
包含在UIView
中,其updateConstraints()
函数如下所示:
override func updateConstraints() {
self.tableView.layoutIfNeeded()
self.tableViewHeight.constant = min(300, self.tableView.contentSize.height)
super.updateConstraints()
}
tableViewHeight
是表格视图的XIB指定高度的IBOutlet
。我得到较小的 - 300点,或表格视图的内容大小的高度。