2015-12-30 2 views
2

Я пытаюсь создать пользовательский стиль выделения для своих ячеек таблицы, создав подкласс UITableViewCell. Когда я нажимаю на ячейку, я хочу, чтобы она меняла цвет и возвращалась обратно к исходному цвету. Я читал другие сообщения на SO, например this one, но, похоже, он не работает.Как изменить цвет текстовых меток во время выбора UITableViewCell?

Редактировать: 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) 

ответ

3

мне как-то удалось решить, но это просто не чувствую, что так оно и должно быть. Не должно ли быть намного проще оживить такую ​​простую анимацию для 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() 
}