UITableViewCell背景颜色问题

时间:2011-06-14 16:19:51

标签: objective-c cocoa-touch uitableview

我将UITableViewCell子类化为将单元格背景颜色设置为我需要的颜色:

·H

@interface DataViewCustomCell : UITableViewCell {
    UIColor* cellColor;
    UIColor* standardColor;
}
- (void) setCellColor: (UIColor*)color;

@end

的.m

@implementation DataViewCustomCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void) setCellColor: (UIColor*)color
{
    cellColor = color;
}

- (void) spreadBackgroundColor: (UIView*)that withColor: (UIColor*)bkColor
{
    NSEnumerator *enumerator = [that.subviews objectEnumerator];
    id anObject;

    while (anObject = [enumerator nextObject]) {
        if([anObject isKindOfClass: [UIView class]])
        {
            ((UIView*)anObject).backgroundColor = bkColor;
            [self spreadBackgroundColor:anObject withColor:bkColor];
        }
    }
}

- (void) layoutSubviews {
    [super layoutSubviews]; // layouts the cell as UITableViewCellStyleValue2 would normally look like

    if(!self.selected && NULL != cellColor)
    {
        [self spreadBackgroundColor:self withColor:cellColor];
    }
}

- (void)dealloc
{
    [super dealloc];
}

@end

当我用我想要的颜色调用setCellColor时,一切顺利,但是当我找不到恢复原始颜色的方法时:当我用UITableViewStylePlain样式设置[UIColor clearColor]时结果不好 - 找。

Wrong result

如果没有缺少细胞分离线,我怎样才能获得良好的结果?

6 个答案:

答案 0 :(得分:10)

我遇到了类似的问题并找到了edo42的答案。然而,我在单元格中的文本背后有一个问题,没有显示我设置的背景颜色。我相信这是由于风格:UITableViewCellStyleSubtitle。

如果其他人偶然发现这个问题,我相信在这个问题中可以找到更好的解决方案:

UITableViewCellStyleSubtitle标签的BackgroundColor? BackgroundColor of UITableViewCellStyleSubtitle labels?

答案在此重印:

要更改表格视图单元格的背景颜色,您需要在tableView中设置它:willDisplayCell:forRowAtIndexPath:而不是tableView:cellForRowAtIndexPath:否则它不会产生任何影响,例如:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor whiteColor];
}

答案 1 :(得分:8)

最后,我自己解决了这个问题。我在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中使用了以下代码而不是子类:

    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor greenColor]; //The color you want
    cell.backgroundView = bg;
    cell.textLabel.backgroundColor = bg.backgroundColor;
    [bg release];

答案 2 :(得分:0)

为什么在设置新单元格颜色之前不要捕获UIColor变量中的旧单元格颜色。 尝试 UIColor * originalColor = anObject.backgroundColor; 然后当你想要改回来时,只需将单元格颜色改为originalColor。

答案 3 :(得分:0)

我发现最好从自定义单元格的.m文件中调整颜色,而不是tableViewController。看起来更直观,而且更容易一些。只需根据需要调整颜色:

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

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

注意:请确保在通话结束时也调用这些方法的超级,例如如果你想让你的手机保持绿色触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
     self.backgroundColor = [UIColor greenColor];
     [super touchesBegan:touches withEvent:event];
}

另外,根据我的经验,不值得调整touchesEnded中的颜色,因为您的手机通常无法及时调整以便用户快速选择。

答案 4 :(得分:0)

根据Apple文档

,你应该总是在willDisplayCell:forRowAtIndex而不是cellForRowAtIndex方法中为单元格提供更改

这个作品!!

答案 5 :(得分:0)

更改以下委托方法中的颜色:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}