在自定义UITableView中更改单元格高度

时间:2018-01-23 18:51:03

标签: ios uitableview

我有一个具有自我调整大小行为的表视图,一切都在初始加载时运行良好。每个单元格都有一个添加注释的条款,这些注释显示在标题下的单元格上,并且可以容纳单元格需要调整自身大小的注释文本。 我尝试调整约束并在contentView上调用setNeedsLayout但它似乎没有帮助太多而且单元格没有调整大小。 如何在不重新加载tableview的情况下调整单元格大小。

1 个答案:

答案 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)
}

结果是这样的:

Screen GIF

您可以看到完整的游乐场源代码here.