Изменение цвета фона выбранной ячейки? - PullRequest
48 голосов
/ 10 марта 2010

Кто-нибудь знает, как изменить цвет фона ячейки, используя UITableViewCell, для каждой выбранной ячейки? Я создал этот UITableViewCell внутри кода для TableView.

Ответы [ 25 ]

92 голосов
/ 05 июля 2010

Изменение свойства selectedBackgroundView является правильным и простым способом. Я использую следующий код, чтобы изменить цвет выделения:

// set selection color
UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
myBackView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1];
cell.selectedBackgroundView = myBackView;
[myBackView release];
37 голосов
/ 17 февраля 2012

Мне наконец удалось заставить это работать в табличном представлении со стилем, установленным на Сгруппированный.

Сначала установите свойство selectionStyle всех ячеек на UITableViewCellSelectionStyleNone.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Затем внедрите в ваш делегат табличного представления следующее:

static NSColor *SelectedCellBGColor = ...;
static NSColor *NotSelectedCellBGColor = ...;

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *currentSelectedIndexPath = [tableView indexPathForSelectedRow];
    if (currentSelectedIndexPath != nil)
    {
        [[tableView cellForRowAtIndexPath:currentSelectedIndexPath] setBackgroundColor:NotSelectedCellBGColor];
    }

    return indexPath;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:SelectedCellBGColor];
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.isSelected == YES)
    {
        [cell setBackgroundColor:SelectedCellBGColor];
    }
    else
    {
        [cell setBackgroundColor:NotSelectedCellBGColor];
    }
}
19 голосов
/ 04 июля 2013
// animate between regular and selected state
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    [super setSelected:selected animated:animated];

    if (selected) {
        self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
    }
    else {
        self.backgroundColor = [UIColor clearColor];
    }
}
12 голосов
/ 28 февраля 2018

SWIFT 4, XCODE 9, IOS 11

После некоторого тестирования это WILL удаляет цвет фона, если отменить выделение или коснуться ячейки второй раз, когда в табличном представлении Selection установлено значение "Multiple Selection". Также работает, когда для стиля табличного представления установлено значение "Сгруппировано".

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.contentView.backgroundColor = UIColor.darkGray
        }
    }
}

Примечание. Чтобы это работало, как показано ниже, свойству Selection вашей ячейки можно присвоить любое значение НО.

Как это выглядит с разными вариантами

Стиль: Обычный , Выбор: Одиночный выбор

Single Selection

Стиль: Обычный , Выбор: Множественный выбор

Multiple Selection

Стиль: Сгруппированный , Выбор: Множественный выбор

Grouped Multiple Selection

Бонус - Анимация

Для более плавного перехода цвета попробуйте анимацию:

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            UIView.animate(withDuration: 0.3, animations: {
                cell.contentView.backgroundColor = UIColor.darkGray
            })
        }
    }
}

Animated color transition

Бонус - изменение текста и изображения

Вы можете заметить, что значок и цвет текста также меняются при выборе ячейки. Это происходит автоматически, когда вы устанавливаете свойства UIImage и UILabel Highlighted

UIImage

  1. Поставляем два цветных изображения:

Two colored images

  1. Установить свойство выделенного изображения:

Highlighted property

UILabel

Просто укажите цвет для выделенного объекта:

Highlighted Color

11 голосов
/ 20 июня 2013
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
     cell.contentView.backgroundColor = [UIColor yellowColor];

}
9 голосов
/ 12 марта 2014

Я создал UIView и установил свойство ячейки selectedBackgroundView:

UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
7 голосов
/ 10 марта 2010

Если вы говорите о выделенных ячейках, свойство равно -selectedBackgroundView. Это будет показано, когда пользователь выберет вашу ячейку.

6 голосов
/ 10 декабря 2015

Для iOS7 + и, если вы используете Interface Builder , создайте подкласс для своей ячейки и реализуйте:

Objective-C

- (void)awakeFromNib {
    [super awakeFromNib];
    // Default Select background
    UIView *v = [[UIView alloc] init];
    v.backgroundColor = [UIColor redColor];
    self.selectedBackgroundView = v;
}

Swift 2.2

override func awakeFromNib() {
    super.awakeFromNib()
    // Default Select background
    self.selectedBackgroundView = { view in
        view.backgroundColor = .redColor()
        return view
    }(UIView())
}
6 голосов
/ 10 марта 2010

Мне повезло со следующим:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    bool isSelected = // enter your own code here
    if (isSelected)
    {
        [cell setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]];
        [cell setAccessibilityTraits:UIAccessibilityTraitSelected];
    }
    else
    {
        [cell setBackgroundColor:[UIColor clearColor]];
        [cell setAccessibilityTraits:0];
    }
}
6 голосов
/ 14 января 2013

У меня сильно настроенный UITableViewCell. Поэтому я реализовал свой собственный выбор ячеек.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Я создал метод в классе своей ячейки:

- (void)highlightCell:(BOOL)highlight
{
    if (highlight) {
        self.contentView.backgroundColor = RGB(0x355881);
        _bodyLabel.textColor = RGB(0xffffff);
        _fromLabel.textColor = RGB(0xffffff);
        _subjectLabel.textColor = RGB(0xffffff);
        _dateLabel.textColor = RGB(0xffffff);
    }
    else {
        self.contentView.backgroundColor = RGB(0xf7f7f7);;
        _bodyLabel.textColor = RGB(0xaaaaaa);
        _fromLabel.textColor = [UIColor blackColor];
        _subjectLabel.textColor = [UIColor blackColor];
        _dateLabel.textColor = RGB(0x496487);
    }
}

В моем классе UITableViewController в ViewWillAppear добавлено следующее:

NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection];
[cell highlightCell:NO];

В didSelectRow добавлено это:

SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell highlightCell:YES];
...