我试图通过创建UITableViewCell
的子类来为我的表格视图单元格创建自定义选择样式。当我单击一个单元格时,我希望它能够改变颜色并淡化回原始颜色。我已经阅读了其他帖子,例如this one,但它似乎无法发挥作用。
修改:selectionStyle
设置为.None
。
当我使用setHighlighted(_:)
时,颜色不会立即改变,只有在点击持续0.5秒后才会发生。
我还使用了setSelected(_:)
。颜色立即改变但不会改变。所以我在deselectRowAtIndexPath(_:)
中添加了tableView(didSelectRowAtIndexPath:)
,但这根本不会导致任何更改。然后我尝试使用tableView.reloadRowsAtIndexPaths(_:)
,最后颜色发生变化并返回原始颜色。但不幸的是,它没有动画最后一部分,渐渐回归到原来的颜色。另外我注意到颜色改变后,它也会使原始颜色变暗(由tableView.reloadRowsAtIndexPaths(_:)
引起)。
我放弃使用setSelected(_:)
和setHighlighted(_:)
并尝试使用touchesBegan(_:)
和touchesEnded(_:)
。保持简短,与上述相同......
这些是我尝试过的代码(并非全部)。
在UITableViewCell
的子类中:
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
label.textColor = selected ? UIColor.redColor() : UIColor.blackColor()
}
override func setHighlighted(highlighted: Bool, animated: Bool) {
label.textColor = highlighted ? UIColor.redColor() : UIColor.blackColor()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
label.textColor = UIColor.redColor()
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesEnded(touches, withEvent: event)
let changeEnded = CATransition()
changeEnded.duration = 0.5
nameLabel.layer.addAnimation(changeEnded, forKey: nil)
nameLabel.textColor = .blackColor()
}
在表格视图控制器中(不在一起):
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
tableView.deselectRowAtIndexPath(indexPath, animated: true)
答案 0 :(得分:4)
我设法解决了它,但它并不觉得这应该是怎么做的。为UILabel
动画这样一个简单的动画是不是更简单?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let selected = tableView.cellForRowAtIndexPath(indexPath) as! CustomViewCell
let changeColor = CATransition(); changeColor.duration = 1
CATransaction.begin()
CATransaction.setCompletionBlock {
selected.label.layer.addAnimation(changeColor, forKey: nil)
selected.label.textColor = .blackColor()
}
selected.nameLabel.textColor = .redColor()
CATransaction.commit()
}