UITableViewCell 显示白色背景,不能在 iOS7上修改

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

但是,在 iOS7中,单元格总是显示为白色背景。


即使对于 Xcode7,2015,也有 是故事板里的一个漏洞: 您必须在代码中设置单元格的背景颜色。

85564 次浏览

正如苹果 DOC (类引用)所言:

... 在 iOS7中,单元格默认为白色背景; 在 iOS 的早期版本中,单元格继承封闭表视图的背景颜色。如果要更改单元格的背景颜色,请在表视图委托的 < em > tableView: will DisplayCell: forRowAtIndexPath: 方法中进行。

因此,在我的例子中,为了显示具有透明背景的单元格,只需要在表视图控制器中实现委托方法,如下所示:

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

只是注意 : 正如@null 所说,“ ... Interface Builder 里好像有只虫子...”,我不完全确定它是否有 bug,但似乎是这样,因为他的评论得到了一些支持票。因此,如果使用 IB,可能会出现问题。:)

IOS7中 UITableViewCell的默认背景颜色是白色。

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

cell.backgroundColor = [UIColor clearColor];

当将 UI 对象添加到单元格中时,Xcode 5/IOS 7添加了一个新的“ Content View”,它将是单元格中所有元素的超级视图。若要设置单元格的背景色,请设置此内容视图的背景色。上面的解决方案对我不起作用,但是这个方案对我很有效。

在返回单元格之前,在 cellForRowAtIndexPath 方法中编写此代码;

cell.backgroundColor = [UIColor clearColor];

接受的答案并没有解决我的问题,我不得不这样做:

  1. 在 Interface Builder 中,选择表格视图。然后从属性检查器,从 观景部分,将 背景资料设置为透明(0% 不透明度)。

enter image description here

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

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

您也可以使用颜色代码,以使您的 UITableView 细胞利润丰厚。

[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];
}

实际上,我发现问题出在 UITableView 的背景颜色没有设置为清晰。如果您将 UITableViewCell 的背景颜色更改为清除,并发现仍然看到白色,请确保将 UITableView 的背景颜色设置为清除(或任何您想要的)。

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

在斯威夫特

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

我调查了一下,发现单元格背景颜色是由外观系统设置的。因此,如果应用程序中的所有单元格都有清晰的背景,最简单的解决方案是:

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

即使他们有不同的背景,清晰的颜色似乎是最方便的作为默认的。

我发现在 XCode5.1.1和 iOS7.1中没有一个是可行的。

如果你在原型单元格中使用 Interface Builder,选择原型单元格,然后从视图部分的属性选择器中,将默认的背景表单更改为透明颜色:

enter image description here

这似乎工作得很好,也不需要对上面的代码进行任何更改——这是一个纯 IB 解决方案。

默认情况下可能选择了 UITableViewCell。.您可以使用 Xcode 6s new 可视化调试器可视化调试器来确认这一点(或者找出究竟是哪个视图导致了这个白色单元格的出现)。

enter image description here

有趣的是,在知道这些之后。.设置所选单元格的背景颜色以清除 还是不起作用。.做一些更多的研究,发现我只需要修改选择样式,当我创建这个自定义单元格:

- (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;
}

这绝对是个 iOS 漏洞。在 iOS8中,在 Interface Builder中设置背景颜色可以很好地适用于 iPhone,但在 iPad 中,背景颜色总是 whiteColor。为了解决这个问题,在 cellForIndexPath数据源消息中输入:

cell.backgroundColor = cell.backgroundColor

会成功的。这就是为什么我说这是一个错误,因为代码本身是非常扯淡,但它工作。

Swift 1.2解决方案:

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

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


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


return cell
}

为我设置 cell.backgroundColor = cell.contentView.backgroundColor; 无论是在 tableView:willDisplayCell:forRowAtIndexPath:还是 tableView:cell:forRowAtIndexPath:的工作。

这是因为我按照需要设置 contentView 的背景颜色为 Interface Builder。

有过类似的问题,不得不这么做

  1. 将 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
    }