Подтвердить что ты не робот

UITableViewCell: как предотвратить синий фон выбора без borking isSelected?

У меня есть пользовательский подкласс UITableViewCell. Я установил contentView моего подкласса ячейки пользовательский класс UIView, в котором я переопределяю -drawRect: и выполняю все чертежи.

Кроме того, я устанавливаю cell.contentView.opaque = NO для достижения прозрачности в определенных областях ячейки (к сожалению, обратное изображение за столом должно показывать через каждую ячейку в определенных частях, чтобы добиться стилистического эффекта. Я знаю, что это производительность должна быть такой).

Проблема. Я по-прежнему вижу фоновый цвет синего градиента по умолчанию, который рисуется за моей ячейкой (в прозрачных областях), когда он выбран или подсвечен (нажат). Это заслоняет изображение за столом, что плохо.

Цель. Чтобы предотвратить появление синего градиентного фона, но все же сможете проверить свойства cell.isSelected и cell.isHighlighted в пределах -[MyContentView drawRect:], чтобы определить, как рисовать мой собственный пользовательский выбор/выделение.

Что я пробовал:

  • cell.selectionStyle = UITableViewCellSelectionStyleNone имеет желаемый эффект, предотвращающий фоновый фон выбора синего градиента, но также предотвращает правильную установку свойств cell.isSelected и cell.isHighlighted, что означает, что я не могу выполнить свой собственный выбор/выделить рисунок

  • cell.selectionBackgroundView = nil и cell.backgroundView = nil в методе cell -init или -prepareForReuse не препятствует фону выбора синего градиента

  • настройка cell.selectionBackgroundView = nil в методе -[MyContentView -drawRect:] имеет желаемый эффект предотвращения фона выбора синего градиента, но это кажется очень janky

  • overriding - [UITableViewCell setSelected: анимированный:] - не-op. это не имеет желаемого эффекта предотвращения фона выбора синего градиента.

4b9b3361

Ответ 1

Отличный ресурс по настройке UITableViews был этот пост Мэтта Галлахера. То, что вы хотите сделать, - установить выбранныйBackgroundView в новое представление (вместо nil), которое является либо прозрачным, либо UIImageView.

Ответ 2

Вы также должны переопределить setHighlighted: для предотвращения показов синего градиента. Если вы просто переопределите setHighlighted: тогда вы получите мгновенный эффект выбора.

поэтому у вас будут следующие два метода:

- (void)setHighlighted: (BOOL)highlighted animated: (BOOL)animated
{
    // don't highlight
}

- (void)setSelected: (BOOL)selected animated: (BOOL)animated 
{
    // don't select
    //[super setSelected:selected animated:animated];
}

Ответ 3

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ответ 4

На сегодняшний день проще всего, на мой взгляд, добиться этого, установив флажок "Атрибуты таблицы" на экране "Интерфейс", где он говорит "Показать выбор при касании". Смотрите скриншот ниже:

enter image description here

Ответ 5

То, что сработало для меня в прошлом, просто помещает:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { }

В моих подклассах UITableViewCell (потому что он не вызовет супер и сделает сам выделенный). Надеюсь, это то, что вы искали.

Ответ 6

Как насчет этого?

// disable user interaction
cell.userInteractionEnabled = NO;