【发布时间】:2021-01-18 01:58:51
【问题描述】:
我想用UILabel 实现可扩展单元格,当用户点击它时它会增长。我正确设置了约束并在扩展时修改了numberOfLines,以便正确计算大小。
但是,单元格的大小会适当增长,但其内容会被剪掉。当我开始滚动内容时,神奇地出现了。我遵循了一些教程,但我不知道我的错误可能在哪里。请看下面的代码和GIF
编辑:当然,我将UITableView.automaticDimension 作为行高返回
// Label configuration inside cell
private lazy var label: UILabel = {
let l = UILabel()
l.font = .systemFont(ofSize: 14, weight: .regular)
l.numberOfLines = 3
l.lineBreakMode = .byTruncatingTail
return l
}()
// Modifying this value should correctly resize the label
var isExpanded: Bool = false {
didSet {
label.numberOfLines = isExpanded ? 0 : 3
setNeedsLayout()
}
}
// Setting up constraints. I'm using SnapKit for making the constraints
func setupView() {
contentView.addSubview(label)
label.snp.makeConstraints { make in
make.center.equalToSuperview()
make.left.equalToSuperview().offset(15)
make.top.equalToSuperview().offset(4).priority(.high)
}
}
这是视图控制器内部管理 tableView 的代码
func didChangeInfoExpanded(at path: IndexPath) {
DispatchQueue.main.async {
guard let cell = self.tableView.cellForRow(at: path) as? InfoTableCell else {
return
}
cell.isExpanded.toggle()
cell.layoutIfNeeded()
UIView.transition(with: self.tableView, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.tableView.beginUpdates()
self.tableView.endUpdates()
}, completion: nil)
/*
I have also tried reloading the row but it's made a glitchy animation and the content was still clipped
self.tableView.reloadRows(at: [path], with: .automatic)
*/
}
}
【问题讨论】:
-
从你的动画中很难分辨出什么是什么。都是一个细胞吗?并且您想展开/折叠
UILabel?还是那些多个单元格,而您的展开/折叠单元格中只有标签? -
它只是一个单元格,它是一个自定义的 UITableViewCell 子类,它被称为 InfoTableCell。该方法中的路径参数是该单元格的 IndexPath。我想扩展为标签,因此将其 numberOfLines 设置为 0
-
什么触发了
didChangeInfoExpanded()?选择单元格时会调用它吗? -
是的,点击单元格后调用
-
嗯...查看您的代码,您在其中使用交叉溶解过渡是否有特定原因?
标签: ios swift autolayout