Удаление тени текста в 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];
}
При изменениях между состояниями не будет тени.