我有问题如何实现(或甚至可能)使用动态UITableViewCells实现动态UITableView高度。所以,我有一些新闻细节,有一些观点在顶部(图片,标签等),下面我想做的评论部分。滚动的注释是错误的,我需要调整整个tableview和整个屏幕的大小以匹配所有内容大小。我知道tableView是scrollView,我可以制作整个新闻详情视图,如tableview,其中标题将是所有视图(如图像,标签等)。
但我可以让它像这样工作吗?我做了View - > ScrollView - >查看(内容视图)有[图像(具有固定高度),标签等和评论tableView(需要内容大小高度,不可滚动)]我试过
tableView.isScrollEnabled = false
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 220
override func viewWillLayoutSubviews() {
super.updateViewConstraints()
self.tableViewHeight?.constant = self.tableView.contentSize.height
}
但没有运气。唯一发生的事情是我得到的内容大小由公式rows.count * estimatedRowHeight计算,所以有时候我会得到一些内容,有时我在桌子下面有这么多的空白空间。谢谢!
编辑:这是解决方案
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!
private var contentSizeObservation: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
tableView.isScrollEnabled = false
tableView.dataSource = self
contentSizeObservation = tableView.observe(\UITableView.contentSize, options: [.new]) { (_, change) in
if let newSize = change.newValue {
self.tableViewHeight.constant = newSize.height
}
}
}
}
答案 0 :(得分:0)
我认为你需要的只是一个UITableView。只需将您的评论添加为单元格,然后将新闻详细信息设置为tableHeaderView
:https://developer.apple.com/documentation/uikit/uitableview/1614904-tableheaderview。
如果你想在TableView标题中使用AutoLayout,你必须做一些变通办法,但仍然相当容易,你会在StackOverflow上找到很多关于它的主题。对于我的情况,我为UITableView创建了简单的扩展:
internal extension UITableView {
/// Workaround for not working AutoLayout with UITableView.tableHeaderView
/// This function needs to be called after calculating TableView position
/// In case of UIViewController: viewDidLayoutSubviews()
/// In case of UIView: layoutSubviews()
func relayoutTableHeaderView() {
guard let tableHeaderView = tableHeaderView else { return }
tableHeaderView.layoutIfNeeded()
tableHeaderView.frame.size = tableHeaderView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
self.tableHeaderView = tableHeaderView
}
}
可以使用AutoLayout
动态计算标题和单元格