Изменение цвета UITableViewCell при нажатии и выборе состояния

У меня есть UITableView с customCell (CustomCell с 2 ярлыками и одним ImageView).

В обычном режиме мне нужен белый цвет всех ячеек.

Если пользователь нажимает на конкретную ячейку, цвет этой ячейки должен быть серым (остальные ячейки должны быть белыми).

И если пользователь отпустит ту же ячейку, цвет этой ячейки должен быть оранжевым (остальные ячейки должны быть белыми)

Как я могу понять это?

Я пробовал это, используя методы setSelectedBackground, willSelectRowAtIndexPath и Gestures. Но не могу видеть эти 3 состояния цвета для одной и той же ячейки. Любое из двух государств работает вместе.

Любая идея, как я могу добиться той же функциональности?

Я реализовал ту же функциональность в Android, используя селекторы. Я хочу такую ​​же функциональность в iPhone. Любая помощь?

Заранее спасибо!


person Akbari Dipali    schedule 04.03.2013    source источник
comment
Было бы полезно, если бы вы предоставили немного исходного кода.   -  person aqua    schedule 04.03.2013
comment
вы используете пользовательский вид ячейки?   -  person NANNAV    schedule 04.03.2013
comment
@NANNAV да, я использовал пользовательские ячейки   -  person Akbari Dipali    schedule 04.03.2013
comment
изменить цвет фона ячейки в didSelectRowAtIndexPath:   -  person NANNAV    schedule 04.03.2013


Ответы (3)


Если вы хотите серый, то

cell.selectionStyle=UITableViewCellSelectionStyleGray;  

Или вы можете установить цвет фона на didSelectRow

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView reloadData];
    UITableViewCell *cell=(UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];
    [cell setBackgroundColor:[UIColor orangeColor]];
}  

Если вы не хотите перезагружать tableData, вам нужно сохранить значение предыдущего выбранного индекса, а затем

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Make oreange cell
    UITableViewCell *presentCell=(UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];
    [presentCell setBackgroundColor:[UIColor orangeColor]];

    //make your previous cellBackgrod to clear, you can make it white as per your requirement
    UITableViewCell *previouscell=(UITableViewCell*)[tableView cellForRowAtIndexPath:previousSelectedCellIndexPath];
    [previouscell setBackgroundColor:[UIColor clearColor]];

    //save your selected cell index
    previousSelectedCellIndexPath=indexPath;
}
person Rajneesh071    schedule 04.03.2013
comment
но это сработает только в том случае, если он коснется этой ячейки, и когда он отпустит касание, он снова станет белым... - person Kasaname; 04.03.2013
comment
@Rajneesh071 Rajneesh071 меняет только цвет выделения. Не при нажатии - person Akbari Dipali; 04.03.2013
comment
@ Rajneesh071 Rajneesh071 работает, но проблема только в том, что при перезагрузке tableView таблица мерцает. Но функции в соответствии с требованием - person Akbari Dipali; 04.03.2013
comment
Я извлекаю данные табличного представления из rss-каналов, и, поскольку данные имеют большой размер, когда я перезагружаю табличное представление, оно показывает некоторую флэш-память, которая обновляется. Однако я пытаюсь лениво загрузить данные изображения, это может решить проблему. - person Akbari Dipali; 04.03.2013
comment
вам нужно перезагрузить таблицу или предыдущую выбранную ячейку, чтобы удалить цвет фона... - person Rajneesh071; 04.03.2013

Напишите эти два метода в своей пользовательской ячейке

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    self.contentView.backgroundColor=[UIColor greenColor];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    self.contentView.backgroundColor=[UIColor orangeColor];

}
person Anil Kothari    schedule 04.03.2013
comment
@AkbariDipali Возможно, вам придется позвонить [super touchesEnded: touches withEvent: event] - person Jamie Forrest; 17.01.2014
comment
также не забудьте установить соответствующий фон в touchesCancelled - person Henrik Hartz; 28.05.2015

Довольно элегантное решение — переопределить метод setHighlighted: вашего tableViewCells.

- (void)setHighlighted:(BOOL)highlighted {
  [super setHighlighted:highlighted];
  if(highlighted) {
    _backView.backgroundColor = [UIColor blueColor];
  }
  else
  {
    _backView.backgroundColor = [UIColor blackColor];
  }
}

UITableView автоматически установит для выбранной ячейки highlighted @property значение YES, когда пользователь коснется ячейки.

Не забудьте вызвать [_tableView deselectCellAtIndexPath:indexPath animated:NO]; в вашем методе делегата didSelect tableView, если вы хотите, чтобы ваша ячейка не выделялась!

person Martin    schedule 07.07.2014
comment
Методы мне не звонили с highlighted = YES. Симулятор iOS9 - person Ossir; 04.11.2015