UITableViewCell显示白色背景,无法在iOS7上修改


186

我已经实现了一个继承自的自定义表格视图单元格类UITableViewCell。tableview包含背景图像,所以我希望单元格的背景是透明的。在iOS7之前看起来很棒。

但是,在iOS7中,该单元格始终以白色背景显示。


即使对于2015年的Xcode7,情节提要中也存在错误:您必须在代码中设置单元格的背景色。


您可以通过访问单元格的属性背景色直接更改单元格的背景色。cell.backgroundColor = [UIColor clearColor];
ViruMax 2014年

Answers:


384

正如Apple DOC所说(UITableViewCell类参考):

... 在iOS 7中,默认情况下,单元格具有白色背景;在iOS的早期版本中,单元格继承了封闭表格视图的背景色。如果要更改单元格的背景颜色,请在表视图委托的tableView:willDisplayCell:forRowAtIndexPath:方法中进行更改

因此,对于我的情况而言,要显示具有透明背景的单元格,只需要在表视图控制器中实现委托方法,如下所示:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

只需注意:正如@null所说,“ ...界面生成器中似乎有一个错误……”,我不确定它是否确实存在该错误,但是似乎导致他的评论获得了好评。因此,如果您使用IB,可能会出现问题。:)


53
不幸的是,事实并非如此,界面生成器似乎存在一个错误,因此无法从情节提要中将其设置为我的自定义单元。
Tarek Hallak

1
@null,啊哈,似乎iOS 7 SDK仍有很多错误需要修复。我已经见过一些,但是对于与Storyboard相关的事情,我不知道。:)
Kjuly

4
您也可以在tableView:cellForRowAtIndexPath:方法中执行此操作。
bugloaf 2013年

1
@KendallHelmstetterGelner确定吗?我还没有注意到,似乎仍然对我有用。:)
Kjuly 2014年

1
正如bugloaf所说的那样-在tableView:cellForRowAtIndexPath中进行操作:
2014年

66

我进行了一些调查,发现单元格backgroundColor是由Appearance系统设置的。因此,如果应用程序中的所有单元格都有清晰的背景,那么最简单的解决方案是:

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

即使它们具有不同的背景,清晰的颜色似乎也是最方便的默认颜色。


1
你我的朋友是一个怪物。我继承所有我的UITableViewCellS,所以这不是我的问题,以提供一个初始化设置背景色的超类clearColor,但你猜怎么着?那没用...我的意思是,为什么,APPLE?
Mazyod

这可行。但是,白色会弹出。做出最佳响应(没有弹出)。
卡尔·普雷恩

@Anton Filimonov我现在已经在Appdelegate中的特定viewController中设置了表格视图单元格的外观,我想要为单元格使用不同的颜色,我该如何解决这种情况?我试图在CellWillDisplay委托方法中设置其他颜色,但没有效果。您能帮我吗
Peer Mohamed Thabib

@PeerMohamedThabib请告诉我们有关环境的更多信息(iPad / iPhone,iOS版本)并提供一些代码。实际上,您可以自己调查这种情况-只需创建UITableViewCell的子类,重新定义setBackgroundColor:方法(只需在内部调用超类的实现),然后在此方法上设置一个断点,便会看到在设置单元格颜色后会发生什么变化内部tableView:willDisplayCellAtIndexPath:
Anton Filimonov

1
即使您有混合的单元格,有些带有背景,有些没有(透明)。最简单的方法是定义一个自定义类并编写相同的代码。这样,所有UITableViewCell类都将保持默认状态,而自定义类将具有清晰的颜色。 [[CustomTableCell外观] setBackgroundColor:[UIColor clearColor]]; 这不会影响默认的UITableViewCells,而只会影响自定义单元格。
Ansari'4

30

在返回单元格之前,将其写入您的cellForRowAtIndexPath方法中;

cell.backgroundColor = [UIColor clearColor];

1
这让我有一个问题,在运行iOS 8的iPhone上5
阿尔莫

13

UITableViewCelliOS 7中的的默认背景颜色为白色。

您必须backgroundColor在代码中的某处设置该属性。例如,在新创建单元格后进行设置。

cell.backgroundColor = [UIColor clearColor];

我尝试过,但对我没有用。您确定它有效吗?
Matrosov Alexander

我适合initWithCoder:aDecoder方法中的自定义表格视图单元格。
ftvs 2015年

13

实际上,我发现问题是由于未将UITableView的背景色设置为清除而引起的。如果将UITableViewCell的“背景”颜色更改为“清除”,但仍发现白色,请确保将UITableViewCell的背景色设置为“清除”(或任意设置)。

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

在斯威夫特

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

仅供参考,您也可以在IB中进行设置。只需确保更改“视图”部分中的背景颜色,而不只是更改显然没有明显影响的“表格视图”部分即可。
AndyDunn 2014年

1
这也对我有用,我一直在寻找它的快速版本。在代码中添加了对我
有用的内容

10

这绝对是一个iOS错误。在iOS 8中,Interface Builder为iPhone 设置背景色效果很好,但在iPad中,总是这样whiteColor。要解决此问题,请在cellForIndexPath数据源消息中将其放入:

cell.backgroundColor = cell.backgroundColor

它将起作用。这就是我说这是一个bug的原因,因为代码本身非常杂乱无章,但可以正常工作。


Xcode7 / iOS9仍然如此。如上所述,我在tableView:willDisplayCell:forRowAtIndexPath中添加了显式代码。
Andrew Duncan 2015年

在XCode 7.0.1中,编译通用应用程序在运行iOS 7,8,9的iPhone上显示黑色背景,但是在运行iOS 9.0.2的iPad上显示白色背景(可能还有其他背景,但无法验证)。上面的代码修复了它。
ScottyB

对于静态tableView,请使用cell.backgroundColor = UIColor.clearColor()覆盖willDisplayCell。在IB中重新分配颜色设置对我不起作用。
Viktor Kucera

4

可能是默认情况下选择了UITableViewCell。您可以使用Xcode 6的新可视调试器(或确切找出导致该白色单元格出现的视图)来确认这一点。

在此处输入图片说明

有趣的是,在知道了这一点之后。设置所选单元格的背景颜色为清除仍然不起作用。进行更多研究后,发现我在创建此自定义单元格时只需要修改选择样式:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}

可视调试器的断开链接
Suragch '16

3

我发现上述任何一项都不适用于iOS 7.1的XCode 5.1.1。

如果将Interface Builder与原型单元一起使用,请选择原型单元,然后从“视图”部分的属性选择器中,将“背景”表单默认更改为“清除颜色”:

在此处输入图片说明

这似乎工作正常。也不需要更改以上代码-这是一个纯IB解决方案。


2

接受的答案无法为我解决问题。我必须这样做:

  1. 在界面构建器中,选择表视图。然后从属性检查器的“ 视图”部分,将“ 背景”设置为透明(0%不透明度)。

在此处输入图片说明

  1. 从表的数据源类cellForRowAtIndexPath方法中:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

好吧,您使用Interface Builder ..如@null在我的答案下方评论,“ ... interface builder中似乎有一个错误……”,我不确定是否确实存在该错误,但似乎导致评论获得了几票赞成。;)
Kjuly

当涉及透明单元格背景时,iOS7中的某些东西肯定是错误的。希望我的回答对其他与我有相似处境的人有所帮助。
RajV

这不是为表视图创建单元格的正确方法,尤其是在使用Interface Builder / Storyboards时。在代码段中,每当您的委托人要求一个新单元时,就创建一个新单元,这不是重用!为了获得单元复用的性能优势,您应该使用cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]。在较早的版本中,您删除indexPath参数,然后测试是否为nil,并initWithStyle:reuseIdentifier按照nil情况下的代码片段进行实例化。
ikuramedia

ikuramedia:我将重用代码遗漏了。当然,我重复使用单元格。那不是本文的重点。
RajV

2

对我来说, cell.backgroundColor = cell.contentView.backgroundColor; 要么从事工作,tableView:willDisplayCell:forRowAtIndexPath:要么tableView:cell:forRowAtIndexPath:完成工作。

这是因为我根据需要在Interface Builder中设置了ContentView的背景色。


1

将UI对象添加到单元格时,Xcode 5 / IOS 7添加一个新的“内容视图”,它将成为该单元格中所有元素的超级视图。要设置单元格的背景色,请设置此内容视图的背景色。上面的解决方案对我没有用,但是这个对我来说很好。


内容视图在早期的SDK版本中都可用,您只需为内容视图设置背景色即可覆盖单元格的背景视图。
2013年

好吧,它不会在xcode 5之前的界面生成器中自动弹出。
DrBug

我的意思是,您的答案针对的是另一个问题,而不是我的问题。您只想为您的单元格设置背景颜色,对吗?因此,无论单元格默认情况下是否具有白色背景,在iOS 7中,您始终可以通过为内容视图设置颜色来实现它,因为内容视图位于单元格的背景视图之上。合理?;)
Kjuly 2013年

1

Swift 1.2解决方案:

只需为单元格的背景色添加一个明确的定义,如下所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}

抱歉。是我不好 有用。我错过了其他设置。
Sung Kim

1

遇到类似的问题,不得不

  1. 将blue设置为selectionStyle和
  2. 将此添加到代码以更正它

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }

0

您还可以使用颜色代码来使您的UITableView Cell有利可图。

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

这是用于应用颜色代码方法的代码:

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.