UITableViewCell: Как предотвратить выделение синего фона без использования свойства isSelected? - PullRequest
38 голосов
/ 23 мая 2009

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

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

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

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

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

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

  2. установка cell.selectionBackgroundView = nil и cell.backgroundView = nil в методе ячейки -init или -prepareForReuse не препятствует выделению синего градиента фона

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

  4. переопределение - [UITableViewCell setSelected: animated:] для запрета. это не дает желаемого эффекта предотвращения выделения синего градиента фона

Ответы [ 6 ]

68 голосов
/ 06 августа 2009

Вы также должны переопределить 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];
}
61 голосов
/ 01 ноября 2009
cell.selectionStyle = UITableViewCellSelectionStyleNone;
47 голосов
/ 23 мая 2009

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

1 голос
/ 30 ноября 2012

Намного проще - на мой взгляд, - добиться этого, установив флажок Атрибуты табличного представления на экране Interface Builder, где написано «Показать выборку на ощупь». Смотрите скриншот ниже:

enter image description here

0 голосов
/ 23 июня 2010

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

// disable user interaction
cell.userInteractionEnabled = NO;
0 голосов
/ 23 мая 2009

Что работало для меня в прошлом, так это просто:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...