Пользовательский стиль выбора UITableViewCell?

83

Когда я нажимаю на свою UITableViewCell, фоновая часть (области, которые не покрывает мое фоновое изображение) становится синей, когда я нажимаю на ячейку. Кроме того, все UILabelсимволы в ячейке становятся белыми, когда по ней щелкают, чего я и хочу.

Однако мне не нужен синий фон, когда я щелкаю по нему, но если я это сделаю selectionstylenone, я потеряю выделенные цвета для UILabels в ячейке.

Так есть ли способ просто избавиться от синего фона при щелчке по ячейке, но сохранить выделенные цвета UILabels?

SimplyKiwi
источник

Ответы:

174

Сделать это можно следующим образом. Установите стиль выделения ячейки таблицы на UITableViewCellSelectionStyleNone. Это уберет выделение синего фона. Затем, чтобы подсветка текстовой метки работала так, как вы хотите, вместо использования класса UITableViewCell по умолчанию создайте подкласс UITableViewCellи переопределите реализацию по умолчанию setHighlighted:animatedс вашей собственной реализацией, которая устанавливает цвета метки, как вы хотите, в зависимости от выделенного состояния .

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}
Джонкролл
источник
11
В качестве побочного примечания убедитесь, что вы переопределили setHighlighted:animated:, который принимает animatedпараметр. Переопределение setHighlighted:метода с одним параметром не сработает.
Имре Келени
14
Мы должны позвонить [super setHighlighted:highlighted animated:animated];?
SoftDesigner
Большое спасибо! Работает как шарм! И это дает мне контроль над выделением других пользовательских представлений в ячейке, если я хочу, потому что стандартное выделение делает это странно.
imike
2
Но у этого метода есть одна проблема, когда вы переопределяете setHighlightedи setSelected. Сначала вы выбираете ячейку, ок, меняете textColor на белый, затем вы прокручиваете эту ячейку за пределы визуальной части экрана, затем прокручиваете назад, видите, textColor становится черным
ronan
1
@jonkroll Я понял эту концепцию, но мое требование состоит в том, что при выборе ячейки цвет textLabel этой ячейки должен оставаться как selectedColor, прямо сейчас он просто меняет цвет textLabel во время выбора, после этого выбранный TextLabel остается в оригинальном цвете
Samarth Kejriwal
75

Если вы работаете до iOS7, отключите стиль выделения ячеек.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

В противном случае оставьте это UITableViewCellSelectionStyleDefault

Потом:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Этот код будет работать правильно

Альфа
источник
2
@iBradApps ... здесь вы не создаете никакого настраиваемого класса ... ячейки таблицы пользовательского интерфейса
Alfa
2
Подтверждение этому - это единственное решение, которое сработало для меня для изменения нетекстового цвета выделенной ячейки в iOS 7.
Верн Дженсен
1
selectionstyle должен быть selectionStyle
braden
12
Это решение работало на iOS7, но только после того, как я установил selectionStyle на UITableViewCellStyleDefault.
Jay Q.
1
Этот метод является единственным методом, который полностью идентичен поведению Apple при выборе ячеек «из коробки». Это должен быть принятый ответ.
mkll
16

Вы можете использовать следующие методы делегата после установки стиля выбора на none:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Реализуйте свой код здесь, например

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}
Шрам
источник
1
Отличное и чистое решение! Вам нужно только реализовать вызов willDeselectRowAtIndexPath, и он работает как по волшебству!
Matej Balantič 05
1
Возможным недостатком здесь является то, что этот метод не вызывается, пока ваш палец не покинет выбранную ячейку; некоторые другие подходы вступают в силу, как только вы касаетесь ячейки.
arlomedia 06
14

Чтобы выполнить эту работу, вы должны установить стиль выделения, UITableViewCellSelectionStyleNoneа затем переопределить метод, setSelected:animated:чтобы получить желаемый результат. Он делает то же самое, что и механизм автоматического выбора iOS, когда вы видите синий (или серый) выбор.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Вы также можете настроить это другим способом, например, изменив фон UITableViewCell и т. Д.

who9vy
источник
13

В cellForRowAtIndexPath используйте этот код:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Надеюсь, это сработает для вас.

Наслаждайтесь кодированием :)

Мрунал
источник
Этот ответ должен быть на высоте. :)
Chintan Patel
2
Это не сработает. Если вы хотите сделать [cell.textLabel setHighlightedTextColor: [UIColor blueColor]]; Cell selectionStyle не должно быть NONE.
Femina
6

Переопределение следующих функций в вашем подклассе UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
superarts.org
источник
Спасибо; это было единственное, что не приводит к выделению всей строки от левого края экрана вправо при изменении цвета фона.
Хосе Рамирес,
Я переопределял только setSelected, поэтому по какой-то причине ячейка все еще иногда мигала.
Зонили Джейм
3

Чтобы соответствовать стандартному поведению стиля выбора, вам нужно переопределить оба setHighlighted:animated:и setSelected:animated:. Вы, вероятно, захотите переместить этот код в общий метод, чтобы избежать дублирования кода.

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

override func setSelected(selected: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}
Логан Готье
источник
1

В пользовательской ячейке переопределите реализацию по умолчанию awakeFromNib & setSelected:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

Кроме того , убедитесь , что стиль выбора будет НЕ установлен в None .

зиаван
источник
0

Единственный способ заставить его работать - это:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}
Рудольф Реал
источник
0

Также вы можете использовать contentView.alpha. Вот пример.

Сначала установите стиль выделения для своей ячейки:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Затем в пользовательском классе ячейки переопределите этот метод с помощью примера анимации:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
Алексей Коловатов
источник