3 回答
TA贡献2065条经验 获得超14个赞
实际上,我自己找到了答案。
我只是创建一个新CGRect的tableView.frame用height的table.contentSize.height
这台的高度UITableView到height它的内容。由于代码修改了UI,因此请不要忘记在主线程中运行它:
dispatch_async(dispatch_get_main_queue(), ^{
//This code will run in the main thread:
CGRect frame = self.tableView.frame;
frame.size.height = self.tableView.contentSize.height;
self.tableView.frame = frame;
});
TA贡献1772条经验 获得超6个赞
无需KVO,DispatchQueue或自行设置约束的Swift 5和4.2解决方案。
该解决方案基于Gulz的答案。
1)创建以下子类UITableView:
import UIKit
final class ContentSizedTableView: UITableView {
override var contentSize:CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
}
}
2)UITableView在布局中添加一个,并在所有侧面设置约束。将其类别设置为ContentSizedTableView。
3)您应该看到一些错误,因为Storyboard并未考虑我们的子类intrinsicContentSize。通过打开大小检查器并将internalContentSize重写为占位符值来解决此问题。这是设计时间的替代。在运行时,它将在ContentSizedTableView类中使用重写
更新:更改了Swift 4.2的代码。如果您使用的是早期版本,请使用UIViewNoIntrinsicMetric代替UIView.noIntrinsicMetric
TA贡献1802条经验 获得超10个赞
快速解决方案
跟着这些步骤:
1-在情节提要中设置表格的高度限制。
2-从情节提要中拖动高度约束,并在视图控制器文件中为其创建@IBOutlet。
@IBOutlet weak var tableHeight: NSLayoutConstraint!
3-然后您可以使用以下代码动态更改桌子的高度:
override func viewWillLayoutSubviews() {
super.updateViewConstraints()
self.tableHeight?.constant = self.table.contentSize.height
}
更新资料
如果为您剪切了最后一行,请尝试在willDisplay单元格函数中调用viewWillLayoutSubviews():
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
self.viewWillLayoutSubviews()
}
- 3 回答
- 0 关注
- 826 浏览
添加回答
举报