我希望UITableViewCell突出显示灰色,然后在用户触摸UITableViewCell后返回白色。
我可以让它变成灰色但它会一直保持灰色,直到用户选择另一个单元格...
这是我的代码。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
}
答案 0 :(得分:4)
要取消选择,您可以添加此
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
in
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
修改1
尝试将其更改为
double delayInSeconds = 0.8;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[tableView deselectRowAtIndexPath:indexPath animated:YES];
});
答案 1 :(得分:0)
您可以对UITableViewCell进行子类化并覆盖- (void)setSelected:(BOOL)selected animated:(BOOL)animated
方法,以便执行所需的行为。
例如,您可以更改单元格背景的颜色,然后在0.5秒后触发计时器以将其转换为原始背景。
答案 2 :(得分:0)
Swift 3
let delayInSeconds = 0.7;
DispatchQueue.main.asyncAfter(deadline: .now() + delayInSeconds * 1) {
tableView.deselectRow(at: indexPath, animated: true)
}
答案 3 :(得分:0)
感谢Meseery,我的版本(Swift 5)变成了:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
tableView.deselectRow(at: indexPath, animated: true)
}
}
答案 4 :(得分:0)
Swift 5:
在继承自 UITableViewCell 的自定义单元格上覆盖此方法,在它里面你可以做任何你需要做的事情。在这种情况下,如果选中,我会将自定义视图 containerView
更改为灰色,并立即将其动画恢复为白色。
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
guard selected else { return }
containerView.backgroundColor = .systemGray6
UIView.animate(withDuration: 0.5) { [weak self] in
self?.containerView.backgroundColor = .white
}
}