我在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];
}
}
答案 0 :(得分:35)
应该工作的一种方法是扩展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;
}
答案 1 :(得分:3)
使用-tableView:willDisplayCell:forRowAtIndexPath:
。这是在实际显示单元格之前调用的最后一件事,因此您可以查询其selected
属性并相应地设置文本阴影。
答案 2 :(得分:3)
您应该覆盖tableView:willDisplayCell:forRowAtIndexPath:
,并且需要将backgroundColor
设置为[UIColor clearColor]
,此外,您应该只对突出显示的状态进行操作,所选状态的含义略有不同
答案 3 :(得分:2)
我认为这更好:
- (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];
}
状态之间的变化不会有阴影。