UITableViewCell在取消选择时选择了阴影颜色

时间:2012-10-24 17:52:04

标签: iphone objective-c ios ipad uitableview

我有一个标准的UITableView。我想将单元格shadowColor的{​​{1}}设置为textLabel,但仅限于触摸单元格时。为此,我使用以下代码。它是一个自定义的UITableViewCell子类,它覆盖setSelected / setHighlighted:

[UIColor whiteColor]

这种方法的问题在于,取消选择时,单元格的周期非常短,标签的文本和阴影都是白色。请参阅此截图,这是在确切的时刻拍摄的。取消选择:

Shadow Example

这与这两个帖子的方法基本相同:

UILabel shadow from custom cell selected color

Removing text shadow in UITableViewCell when it's selected

我在后一个问题中使用了接受答案的方法。

我创建了一个非常简单的代码项目 uploaded it to github 。它显示了我的问题。它只是一个显示单个单元格的UITableViewController。

除此之外,没什么好看的。 UITableView委托方法:

@implementation ExampleTableViewCell


- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    [self setShadowColorSelected:selected];

}

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

- (void)setShadowColorSelected:(BOOL)selected {
    if (selected) {
        self.textLabel.shadowColor = [UIColor blackColor];
    }else {
        self.textLabel.shadowColor = [UIColor whiteColor];
    }
}

@end

有什么想法吗?

8 个答案:

答案 0 :(得分:5)

如果我理解了这个问题,你需要显示阴影颜色,直到细胞选择被动画化为止。我不确定你尝试的方式有什么不对,更直接的解决方案可以正常工作。

请注意,一旦不需要,您将需要删除观察者。

<强> ExampleTableViewCell.h

@interface ExampleTableViewCell : UITableViewCell {

}

- (void) setSelectionShadowOfColor:(UIColor *) selColor;
@end

<强> ExampleTableViewCell.m

@implementation ExampleTableViewCell

- (void) setSelectionShadowOfColor:(UIColor *) selColor {
    self.textLabel
    [self addObserver:self
           forKeyPath:@"textLabel.highlighted" // not isHighlighted as that is a getter name of the highlighted property
              options:NSKeyValueObservingOptionNew
              context:NULL];
}


- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {

    BOOL isHighlighted = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];

    if (isHighlighted) {
        self.textLabel.shadowColor = [UIColor blackColor];
    } else {
        self.textLabel.shadowColor = [UIColor whiteColor];
    }
}

@end

<强> ExampleTableViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    ExampleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // note the type ExampleTableViewCell is used here to avoid the interface lookup mess
    if (!cell) {
        cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        [cell setSelectionShadowOfColor:[UIColor blackColor]];
    }
    cell.textLabel.text = @"test";

    return cell;
}

答案 1 :(得分:2)

将以下内容添加到您的UITableViewDelegate:

NSIndexPath *selectedIndex;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = @"test";
    if(indexpath == selectedIndex)
    {
        cell.textlabel.shadowColor = [UIColor blackColor];
    }
    else
    {
        cell.textlabel.shadowColor = [UIColor whiteColor];
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView beginUpdates];
    selectedIndex = indexpath;
    [self.tableView endUpdates];
}

答案 2 :(得分:0)

这是我能做的最好的事情:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:NO];

    [self setShadowColorSelected:selected];
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:YES];

    [self setShadowColorSelected:highlighted];
}

- (void)setShadowColorSelected:(BOOL)selected {
    [self.textLabel setBackgroundColor:[UIColor clearColor]];

    if (selected)
    {
        [self.textLabel setTextColor:[UIColor whiteColor]];
        [self.textLabel setShadowColor:[UIColor blackColor]];

        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView transitionWithView:self.textLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
            if (selected)
            {
                [self.textLabel setTextColor:[UIColor whiteColor]];
                [self.textLabel setShadowColor:[UIColor blackColor]];
            }
            else
            {
                [self.textLabel setTextColor:[UIColor blackColor]];
                [self.textLabel setShadowColor:[UIColor whiteColor]];
            }
        } completion:nil];
    }
    else
    {
         [self.textLabel setTextColor:[UIColor blackColor]];
         [self.textLabel setShadowColor:[UIColor whiteColor]];
    }
}

答案 3 :(得分:0)

根据我的理解,您可以通过使用以下代码更改tableview的颜色来消除此问题

[tableView setBackgroundColor:[UIColor "GrayColor"]];

答案 4 :(得分:0)

这是实现目标的简单方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    self.textLabel.shadowColor = [UIColor blackColor];
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    self.textLabel.shadowColor = [UIColor whiteColor];
    [super touchesEnded:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {

    self.textLabel.shadowColor = [UIColor whiteColor];
    [super touchesCancelled:touches withEvent:event];
}

答案 5 :(得分:0)

我猜您应该使用与UITableView用于动画选择/取消选择的相同持续时间来更改文本/阴影颜色的动画。根据我的理解,你可以在tableView 开始动画显示选择高亮显示(dis)的确切时刻更改文本/阴影颜色,所以你得到的是你的颜色瞬间变化,而选择突出显示需要一些时间来动画从一个状态到另一个状态

尝试这样的事情:

__block UIColor *newShadowColor = selected ? [UIColor blackColor] : [UIColor whiteColor];
[UIView animateWithDuration:0.2
                 animations:^{
                        /* change your label/shadow color here. */
                        self.textLabel.shadowColor = newShadowColor;
                 }
                 completion:^(BOOL finished){
                       /* this is where the cell is no longer selected
                          or highlighted. You may do some additional style changes to your
                          label here */ }];

答案 6 :(得分:0)

我有同样的问题。我查看的所有解决方案都需要进行分段/过多的额外代码。

我最后做的是在主要UILabel下创建第二个UILabel以充当阴影。

不要在主标签和阴影标签上设置阴影。对于阴影标签,将“正常颜色”设置为您想要的阴影颜色,并将突出显示的颜色设置为“清除颜色”。

显然,每次更新主标签时都必须更新阴影标签。在许多情况下,付出的代价不是很高。

希望有所帮助!

答案 7 :(得分:0)

我也遇到了同样的问题。

您可以使用UIButton代替使用默认标签,并解决您的问题。

将自定义按钮放入单元格。

我的要求得到了解决。它可能会对你有帮助。