在UITableViewCell中选中时删除文本阴影

时间:2009-07-26 08:04:07

标签: iphone objective-c cocoa-touch uitableview

我在UITableView的单元格中添加了一个文本阴影给它们一个蚀刻的外观:

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

由于阴影颜色实际上是白色,当一行被选中并变为蓝色时,白色阴影变得非常明显并使文本看起来很难看。

有人知道如何在应用默认单元格选择样式之前删除阴影吗?

我试过了:

  1. 使用-tableView:willSelectRowAtIndexPath:取消设置cell.textLabel.shadowColor = nil的阴影,但这不会及时生效 - 仅在应用蓝色选择样式后才会设置阴影。
  2. 在设置阴影之前检查cell.selected中的tableView:cellForRowAtIndexPath:,但这显然不起作用,因为在选择后不会重绘单元格。
  3. 我也试过覆盖-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];
      }
    }
    

4 个答案:

答案 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];
}

状态之间的变化不会有阴影。