我想要实现的是:单击其中的标签时,单元格可以展开/折叠。应该记住单元格大小,以便当用户滚动回单元格时,它应该是以前的大小。我使用自动布局设置单元格,所有视图都分配了高度约束。当用户点击标签时,我通过更改标签的高度约束来更改单元格高度:
func triggerExpandCollapse(_ cell: UITableViewCell) {
guard let cell = cell as? ActivityTableViewCell, let indexPath = self.activitiesTableView.indexPath(for: cell) else { return }
if !self.expandedCellIndex.insert(indexPath.row).inserted {
self.expandedCellIndex.remove(indexPath.row)
cell.descLabelHeightConstraint.constant = 60
}
else {
cell.descLabelHeightConstraint.constant = cell.descLabel.intrinsicContentSize.height
}
self.activitiesTableView.beginUpdates()
self.activitiesTableView.endUpdates()
}
并在返回每个单元格之前配置单元格的高度:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: Constants.TableViewCellID.activity, for: indexPath)
guard let activityCell = cell as? ActivityTableViewCell else {
return cell
}
activityCell.delegate = self
if self.expandedCellIndex.contains(indexPath.row) {
activityCell.descLabelHeightConstraint.constant = activityCell.descLabel.intrinsicContentSize.height
}
else {
activityCell.descLabelHeightConstraint.constant = 60
}
activityCell.layoutIfNeeded()
return activityCell
}
我还通过以下方式启用自动布局:
self.activitiesTableView.rowHeight = UITableViewAutomaticDimension
self.activitiesTableView.estimatedRowHeight = 1000
到目前为止,除最后一个之外,单元格可以使用正常的滚动行为进行扩展/折叠!当我展开最后一个并向上滚动时,activitiesTableView
看起来“跳跃”了一小段距离。细节可以参考video
我现在不知道如何调试。有人有一些想法吗?感谢。
答案 0 :(得分:0)
在我睡了一觉之后,我做了一些尝试,找到了一种方法来扩展/折叠带有动画和平滑UITableView滚动的单元格,我所做的可以在以下更改中描述:
在动画块中包含layoutIfNeeded
的单元格beginUpdates
和endUpdates
,以触发单元格展开/折叠。完整版是:
func triggerExpandCollapse(_ cell: UITableViewCell) {
guard let cell = cell as? DonationsTableViewCell, let indexPath = self.donationsTableView.indexPath(for: cell) else { return }
if !self.expandedCellsSet.insert(indexPath.row).inserted // Collapse
{
self.expandedCellsSet.remove(indexPath.row)
cell.projectDescLabelHeightConstraint.constant = 60
}
else // Expand
{
cell.projectDescLabelHeightConstraint.constant = cell.projectDescLabel.intrinsicContentSize.height
}
UIView.animate(withDuration: Constants.TimeDuration.cellExpandCollapse, delay: 0, options: .curveEaseInOut, animations: {
cell.layoutIfNeeded()
self.donationsTableView.beginUpdates()
self.donationsTableView.endUpdates()
}, completion: nil)
}
在这种情况下,滚动指示符会在用户滚动时更改其大小。那是因为estimatedRowHeight
与实际的单元格高度太不相同了。我建议实施tableView(_:estimatedHeightForRowAt:)
以提供每个细胞的近似高度。请注意,如果返回的值太大,则展开/折叠行为将是异常的
如果有人有更好的解决方案,我将非常感激!