我有一个具有自我调整大小行为的表视图,一切都在初始加载时运行良好。每个单元格都有一个添加注释的条款,这些注释显示在标题下的单元格上,并且可以容纳单元格需要调整自身大小的注释文本。 我尝试调整约束并在contentView上调用setNeedsLayout但它似乎没有帮助太多而且单元格没有调整大小。 如何在不重新加载tableview的情况下调整单元格大小。
答案 0 :(得分:1)
需要将对表视图单元维度的更改传递到其父表视图,以便可以更改其他单元格大小。最简单的方法是在beginUpdates()
和endUpdates()
中包装大小更改,这也会导致更改动画。
例如,假设我的UITableViewCell
具有展开和折叠状态:
final class TableViewCell: UITableViewCell {
var isExpanded: Bool = false {
didSet {
heightConstraint.constant = isExpanded ? 150 : 75
}
}
lazy var heightConstraint = self.heightAnchor.constraint(equalToConstant: 75)
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
heightConstraint.isActive = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
由isExpanded: Bool
控制。
我可以通过以下方式展开或折叠表格视图中的所有可见TableViewCell
:
@objc
private func toggleExpanded() {
tableView.beginUpdates()
// Finding all of the visible cells of type `TableViewCell` and changing isExpanded to not isExpanded
tableView.visibleCells.flatMap { $0 as? TableViewCell }.forEach { $0.isExpanded = !$0.isExpanded }
tableView.endUpdates()
// toggle back in 2 seconds
perform(#selector(self.toggleExpanded), with: nil, afterDelay: 2.0)
}
结果是这样的:
您可以看到完整的游乐场源代码here.