我有一个带有 stackView 的 tableViewCell。我试图让它成为一个可折叠的单元格。我可以在 tableView:cellForRowAt 期间成功设置第二个标签的隐藏状态:
但是,如果我响应单元格的点击而更改隐藏状态,则屏幕上的可见性不会改变。
UIView.animate(withDuration: 0.25) { [unowned self] in
self.disclaimers.isHidden = !cellItem.isExpanded
}
cellItem.isExpanded 属性与标签 .isHidden 属性一样正确切换。只是屏幕上没有变化。
我知道这已经在主线程上,因为在主线程上调用了 tableView:didSelectRowAt: 。但为了掩饰自己,我尝试使用 DispatchQueue.main.async { } 调用而不是 UIView.animate 来包装该行。没有变化。
有什么想法吗?
如果您愿意,完整的项目就在这里:https://github.com/AaronBratcher/TableViewTester
问题在 DisclaimersCell.swift 中。第33行
最佳答案
几个问题...
除了 cellForRowAt
之外,您不应该在任何地方调用 .dequeueReusableCell
。您在 TableViewController.swift
-> didSelectRowAt
中执行此操作...这会创建单元格的新实例,不是 表中的现有实例。将您的 guard
行更改为:
guard var cellItem = helper.cellForRowAtIndexPath(indexPath) as? TableViewExpandableCellItem
, let cell = tableView.cellForRow(at: indexPath) as? TableViewExpandableCell
, cellItem.shouldExpand
else { return }
这样,tableView.cellForRow(at: indexPath)
将返回现有单元格。
接下来,对 .isHidden
设置进行动画处理不会为您提供所需的动画。
在 DisclaimersCell.swift
-> toggleExpansion()
中,更改:
UIView.animate(withDuration: 0.25) { [unowned self] in
self.disclaimers.isHidden = !cellItem.isExpanded
}
简单地说:
self.disclaimers.isHidden = !cellItem.isExpanded
然后,在 TableViewController didSelectRowAt
函数中:
cellItem.isExpanded = !cellItem.isExpanded
cell.toggleExpansion(tableViewCellItem: cellItem)
tableView.beginUpdates()
tableView.endUpdates()
这将告诉单元格隐藏/显示标签,并将 .beginUpdates()
与 endUpdates()
配对将触发重新计算表格中的行高,并设置重绘动画。
关于ios - 为什么我的标签没有隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44206818/