我有一个UITableView
(让我们称之为tbl_A)在一个表格视图单元格中,其高度是动态的并由UITableViewAutomaticDimension
设置。 tbl_A的单元格高度也是动态的,我知道tbl_A的数据不会太多。所以我希望tbl_A 滚动禁用,其 frame.size等于其内容大小。我试图设置tbl_A&#39的frame.size.height = tbl_A.contentSize.height,遗憾的是,高度错误。
顺便说一下,我不必使用UITableView
来完成这项任务。我只是想以一种方式显示所有数据。有什么建议吗?
答案 0 :(得分:9)
简单;)
override var intrinsicContentSize: CGSize {
return contentSize
}
答案 1 :(得分:4)
基于@Emad的答案,但有重要的补充,如果contentSize更改,则会使固有内容大小无效。
class ContentWrappingTableView: UITableView {
override var intrinsicContentSize: CGSize {
return self.contentSize
}
override var contentSize: CGSize {
didSet {
self.invalidateIntrinsicContentSize()
}
}
}
答案 2 :(得分:2)
只要滚动被锁定,您就可以使用以下内容动态匹配tableView的布局:
let size = actionsViewController.view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
actionsViewController.view.frame.size = size
actionsViewController.preferredContentSize = size
以下介绍了一种自动布局为您计算高度的方法,并根据您传入的限制为您提供尺寸。另一种方法可能如下:
CGFloat leftViewHeight = 0;
if (self.isExpanded) {
[self.lineItemLineNumberListTableViewController.tableView layoutIfNeeded];
UITableView *tableView = self.lineItemLineNumberListTableViewController.tableView;
CGSize tableViewContentSize = tableView.contentSize;
leftViewHeight = tableViewContentSize.height;
}
self.leftViewHeightConstraint.constant = leftViewHeight;
我以前使用上面的内容来动态扩展动态调整单元格,并在其中包含动态子视图。这会在重新加载tableView的内容后根据内容大小配置高度约束,以确保在调整大小之前加载内容。
答案 3 :(得分:0)
答案 4 :(得分:0)
下面是查找tableView内容大小的方法。
- (CGFloat)tableViewHeightOfTable:(UITableView *)table
{
[table layoutIfNeeded];
return [table contentSize].height;
}
确保在重新加载表后调用此方法,如下面的代码。
[YourTable reloadData];
YourTable.frame.size.height = [self tableViewHeightOfTable:YourTable];
答案 5 :(得分:0)
1)在类中添加对约束的引用:
var heightC: NSLayoutConstraint!
2)禁用滚动并添加高度约束:
tableView.scrollEnabled = false
heightC = tableView.autoSetDimension(.Height, toSize: 20) // using PureLayout library
3)覆盖你的控制器的viewDidLayoutSubviews:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
heightC.constant = tableView.contentSize.height
}
并设置高度约束"常数"属性为tableview内容高度。
4)关于数据刷新(例如当项目数从0变为更多时)只需将主控制器视图强制布局:
view.setNeedsLayout()
答案 6 :(得分:-2)
在你的情况下tableview是最好的解决方案,你可以使用不同的uitableviewcells和section,并可以在cellForRowAtIndexPath中加载它。