Удаление тени текста в UITableViewCell при ее выборе

Я добавил тень текста в ячейки в моем UITableView, чтобы придать им протравленный вид:

cell.textLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.000];
cell.textLabel.shadowColor = [UIColor whiteColor];
cell.textLabel.shadowOffset = CGSizeMake(0, 1);

Поскольку цвет тени на самом деле белый, когда строка выбирается и становится синей, белая тень становится действительно видимой и делает текст уродливым.

Кто-нибудь знает, как я могу удалить тень до того, как будет применен стиль выбора ячейки по умолчанию?

Я пробовал:

  • Используя -tableView:willSelectRowAtIndexPath:, чтобы отменить тень с помощью cell.textLabel.shadowColor = nil, но это не работает вовремя - тень отключается только после применения синего стиля выбора.
  • Проверка cell.selected в tableView:cellForRowAtIndexPath: перед установкой тени, но это, очевидно, не работает, поскольку ячейка не перерисовывается после выделения.

Я также попытался переопределить метод делегата -tableView:willDisplayCell:forRowAtIndexPath:, как предложил Кевин ниже. Из введенных в журнал операторов этот метод делегата вызывается только до того, как ячейка будет нарисована - к моменту касания ячейки уже слишком поздно. Это код, который я использовал

(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
  NSLog(@"in willDisplayCell");
  if (cell.highlighted || cell.selected) {
    NSLog(@"drawing highlighed or selected cell");
    cell.textLabel.shadowColor = nil;
  } else {
    cell.textLabel.shadowColor = [UIColor whiteColor];
  }
}

Ответы

Ответ 1

Один из способов, который должен работать, - расширить UITableViewCell и переопределить методы setSelected AND setHighlighted, соответственно установив состояние тени. Это позволит убедиться, что он был окрашен одновременно с обновлением фона.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    [super setHighlighted:highlighted animated:animated];
    [self applyLabelDropShadow:!highlighted];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    [self applyLabelDropShadow:!selected];
}

- (void)applyLabelDropShadow:(BOOL)applyDropShadow
{
    self.textLabel.shadowColor = applyDropShadow ? [UIColor whiteColor] : nil;
}

Ответ 2

Используйте -tableView:willDisplayCell:forRowAtIndexPath:. То, что на самом деле отображается последнее, что вызывается прямо перед ячейкой, так что вы можете запросить его свойство selected и соответственно установить текстовую тень.

Ответ 3

Вы должны переопределить tableView:willDisplayCell:forRowAtIndexPath:, и вам нужно установить backgroundColor в [UIColor clearColor], также вы должны действовать только в выделенном состоянии, выбранное состояние имеет немного другое значение

Ответ 4

Я думаю, что это лучше:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{ 
    [super setHighlighted:highlighted animated:animated];
    [self applyLabelDropShadow:!self.highlighted];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{   
    [super setSelected:selected animated:animated];
    [self applyLabelDropShadow:!self.selected];
}

При изменениях между состояниями не будет тени.