取消选择时如何停止UITableViewCell闪烁为白色?

时间:2019-05-30 15:51:21

标签: ios swift uitableview

我有一个UITableView的公共模式,它带有一个辅助视图控制器,当选择了一行时,它会被推到顶部。为了在用户关闭第二个视图控制器并返回到表视图时为用户提供一些上下文,该第一个视图控制器具有以下功能:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let index = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: index, animated: animated)
    }
}

这会导致这种意想不到且令人讨厌的过渡,在这种过渡中,取消选择的单元会使其背景消失,然后又恢复为正常:

jarring animation

我希望它会从部分柔和的状态选择过渡到直接回到正常的黑暗状态。

(该单元非常在进行中-尚未完成)

遵循建议here并不是真正的选择,因为我确实希望保留上下文提示,并且整个单元格应该继续具有白色背景。

为响应Rico的问题,将单元格创建为.swift.xib对,视图层次为:

Interface Builder view hierarchy

Swift所做的很少-在两个标签上设置.textInsets,在按钮上绘制显示指示器。

2 个答案:

答案 0 :(得分:0)

我认为这是因为setSelected的默认实现会删除单元格所有子视图的背景色。您可以做的是覆盖setSelected和/或setHighlighted并自己更新单元格。

这还允许您为选定的单元格创建自定义外观。

示例在选中时使用红色背景,而在未选中时使用白色:

override func setSelected(_ selected: Bool, animated: Bool) {
    let animationDuration = animated ? 0.3 : 0
    UIView.animate(withDuration: animationDuration) {
      self.backgroundColor = highlighted ? UIColor.red : UIColor.white
    }
  }

答案 1 :(得分:0)

deselecting方法内调用row而不是viewWillAppear(_:)中的deselectRow(at:animated:),即{p>

tableView(_:didSelectRowAt:)

编辑1:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) //Your rest of the code... } 中,您需要{{1}中的viewWillAppear(_:)deselect中设置为cell的{​​{1}}中的UIView.animate(withDuration:animations:),即

animation