【发布时间】:2019-12-04 14:34:02
【问题描述】:
假设我有这样的层次结构:
*TableViewCell
**TableView
***TableViewCell
并且它们都应该是可调整大小的。有人遇到过这种问题吗?在过去,我使用了许多解决方法,例如systemLayoutSizeFitting 或heightForRowAt 中的高度预计算,但它总是打破一些约束,因为TableViewCell 的高度约束等于估计的行高,并且出现了一些神奇的行为。有什么方法可以实现这一点?
当前解决方法:
class SportCenterReviewsTableCell: UITableViewCell, MVVMView {
var tableView: SelfSizedTableView = {
let view = SelfSizedTableView(frame: .zero)
view.clipsToBounds = true
view.tableFooterView = UIView()
view.separatorStyle = .none
view.isScrollEnabled = false
view.showsVerticalScrollIndicator = false
view.estimatedRowHeight = 0
if #available(iOS 11.0, *) {
view.contentInsetAdjustmentBehavior = .never
} else {
// Fallback on earlier versions
}
return view
}()
private func markup() {
contentView.addSubview(tableView)
tableView.delegate = self
tableView.dataSource = self
tableView.register(ReviewsTableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.snp.makeConstraints() { make in
make.top.equalTo(seeAllButton.snp.bottom).offset(12)
make.left.equalTo(contentView.snp.left)
make.right.equalTo(contentView.snp.right)
make.bottom.lessThanOrEqualTo(contentView.snp.bottom)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ReviewsTableViewCell
cell.viewModel = viewModel.cellViewModels[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ReviewsTableViewCell
cell.viewModel = viewModel.cellViewModels[indexPath.row]
cell.setNeedsLayout()
cell.layoutIfNeeded()
let size = cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize, withHorizontalFittingPriority: .defaultHigh, verticalFittingPriority: .defaultLow)
return size.height
}
}
自定尺寸tableView类:
class SelfSizedTableView: UITableView {
override func reloadData() {
super.reloadData()
self.invalidateIntrinsicContentSize()
self.layoutIfNeeded()
}
override var intrinsicContentSize: CGSize {
self.setNeedsLayout()
self.layoutIfNeeded()
return contentSize
}
}
【问题讨论】:
-
我会尝试为单元格设置自动维度,为 tableView 设置动态高度(高度优先级 = 750,isScrollEnabled = false),或者尝试将表格高度设置为其 contentSize
-
@AlexandrKolesnik 我提供了更多信息,请查看:)。然后,
contentSize的单元格中的automaticDimension等于estimatedRowHeight,它将设置tableViewheight =estimatedRowHeight*numberOfRows。 -
@PrashantTukadiya 抱歉,但您的解决方案对我来说看起来很重要。我需要更稳定的东西。
-
很有趣的问题,找我在GitHub上创建的项目github.com/barbados88/cell-table-cell,稍后我会尝试在没有解决方法的情况下进行。对不起,脏代码
标签: ios swift uitableview uitableviewautomaticdimension