我正在尝试制作可扩展的表格视图(静态单元格)。容器视图放置在“选项列表”单元格下方的单元格内,如下所示:
扩展/折叠时动画会出现问题。每个部分的最顶部单元格将短暂消失(隐藏?),然后在动画结束后重新出现。我后来进行了实验,结果如下:
使用 tableView.reloadData()
时不会发生这种情况。
使用 tableView.beginUpdates() / endUpdates()
对时会发生这种情况。
因此我得出结论,这与动画有关。以下是我的代码和图片,以进一步解释上述问题。
隐藏/显示代码
private func hideContainerView(targetView: UIView) {
if targetView == violationOptionsContainerView {
violationOptionContainerViewVisible = false
}
tableView.beginUpdates()
tableView.endUpdates()
UIView.animate(withDuration: 0.1, animations: { targetView.alpha = 0.0 }) { _ in
targetView.isHidden = true
}
}
private func showContainerView(targetView: UIView) {
if targetView == violationOptionsContainerView {
violationOptionContainerViewVisible = true
}
tableView.beginUpdates()
tableView.endUpdates()
targetView.alpha = 0.0
UIView.animate(withDuration: 0.1, animations: { targetView.alpha = 1.0 }) { _ in
targetView.isHidden = false
}
}
表格视图
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
switch cell {
case violationTableViewCell:
if violationOptionContainerViewVisible {
hideContainerView(targetView: violationOptionsContainerView)
} else {
showContainerView(targetView: violationOptionsContainerView)
}
default: break
}
// tableView.reloadData()
// if we use this instead of begin/end updates, the cells won't disappear. But then we'll be ditching animation too.
}
tableView.deselectRow(at: indexPath, animated: true)
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 && indexPath.row == 3 {
if !violationOptionContainerViewVisible {
return 0.0
}
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
图片
请注意,每个部分中的第一个单元格(“FFFF”和“滑块”)会在动画期间消失并重新出现
答案 0 :(得分:0)
经过几天的搜索,我发现了这种行为的原因。
出于某种原因,我将单元格layer.zposition
设置为默认值零以下。这将导致在动画期间将单元格显示在它的背景视图“下面”(因此消失),即使它是它的子视图。
将值调整回0或更高将消除此问题。