ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

K
Kjuly

正如 Apple DOC 所说 (UITableViewCell Class Reference):

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

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

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

请注意:正如@null 所说,“...界面构建器中似乎存在错误...”,我不完全确定它是否确实存在错误,但似乎是因为他的评论得到了几票赞成。因此,如果您使用 IB,可能会出现问题。 :)


不幸的是,这不是真的,界面生成器中似乎有一个错误,我无法从情节提要中将其设置为我的自定义单元格。
@null,啊哈,看来 iOS 7 SDK 仍然有很多错误需要修复。我已经遇到了一些,但对于 Storyboard 相关的,我不知道。 :)
您也可以在 tableView:cellForRowAtIndexPath: 方法中执行此操作。
@KendallHelmstetterGelner 确定吗?我还没有注意到它,似乎仍然对我有用。 :)
正如 bugloaf 上面所说 - 在 tableView:cellForRowAtIndexPath 中执行:
K
Kyle Clegg

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

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

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


你我的朋友是个怪物。我将 all 我的 UITableViewCell 子类化,因此提供具有初始化程序的超类以将 BG 颜色设置为 clearColor 对我来说不是问题,但你猜怎么着?那没有用...我的意思是,为什么,苹果?
这行得通。然而,白色突然出现在视野之外。以最佳效果获得最佳响应(无爆裂声)。
@Anton Filimonov我已经在我的Appdelegate中设置了表格视图单元格外观现在在一个特定的viewController中我想为单元格设置不同的颜色我该如何处理这个场景?我试图在 CellWillDisplay 委托方法中设置不同的颜色,但没有效果。你能帮我解决这个问题吗
@PeerMohamedThabib 请详细介绍环境(iPad/iPhone,iOS 版本)并提供一些代码。实际上您可以自己调查情况 - 只需创建 UITableViewCell 的子类,重新定义 setBackgroundColor: 方法(只需在内部调用超类的实现)并在此方法中放置一个断点,您将看到设置后单元格颜色会发生什么变化内表视图:willDisplayCellAtIndexPath:
即使您有混合单元格,有些有背景,有些没有(透明)。最简单的方法是定义一个自定义类并编写相同的代码。这样,所有 UITableViewCell 类都将保持默认状态,自定义类将具有清晰的颜色。 [[CustomTableCell 外观] setBackgroundColor:[UIColor clearColor]];这不会影响默认的 UITableViewCells,只会对自定义单元格产生影响。
s
sanjana

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

cell.backgroundColor = [UIColor clearColor];

这帮助我解决了 iPhone 5 上 iOS 8 中的问题。
Y
Yiming Tang

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

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

cell.backgroundColor = [UIColor clearColor];

我试过了,但对我没有用。你确定它有效吗?
适用于 initWithCoder:aDecoder 方法中的自定义表格视图单元格。
x
x4h1d

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

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

在斯威夫特

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

仅供参考,您也可以在 IB 中设置它。只需确保更改“视图”部分中的背景颜色,而不仅仅是显然没有明显影响的“表格视图”部分。
这对我也有用,我正在寻找它的快速版本。在代码中添加了对我有用的内容:)
s
superarts.org

这绝对是一个 iOS 错误。在 iOS 8 中,在 Interface Builder 中设置背景颜色适用于 iPhone,但在 iPad 中始终为 whiteColor。要修复它,在 cellForIndexPath 数据源消息中,将其放入:

cell.backgroundColor = cell.backgroundColor

它会起作用。这正是我说这是一个错误的原因,因为代码本身几乎是胡说八道,但它确实有效。


Xcode7/iOS9 仍然如此。如上所述,我在 tableView:willDisplayCell:forRowAtIndexPath 中添加了显式代码。
在 XCode 7.0.1 编译通用应用程序在运行 iOS 7、8、9 的 iPhone 上显示黑色背景,但在运行 iOS 9.0.2 的 iPad 上显示白色背景(可能还有其他但无法验证)。上面的代码修复了它。
对于静态 tableView,将使用 cell.backgroundColor = UIColor.clearColor() 覆盖 willDisplayCell。在 IB 中重新分配颜色设置对我不起作用。
a
abbood

可能是您的 UITableViewCell 默认被选中。您可以使用 Xcode 6s new visual debugger 确认这一点(或找出导致此白色单元格出现的确切视图)。

https://i.stack.imgur.com/A5t5P.png

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

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

可视化调试器的链接断开
M
Mike

我发现上述方法都不适用于 XCode 5.1.1、iOS 7.1。

如果您使用带有原型单元格的界面生成器,请选择原型单元格,然后从视图部分的属性选择器中,将背景表单默认更改为清除颜色:

https://i.stack.imgur.com/RzMnn.jpg

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


R
RajV

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

在界面生成器中,选择表视图。然后从属性检查器,从视图部分,将背景设置为透明(0% 不透明度)。

https://i.stack.imgur.com/QB6Ki.png

从表的数据源类 cellForRowAtIndexPath 方法:cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.backgroundColor = [UIColor clearColor]; //使单元格透明


好吧,您使用 Interface Builder .. 正如@null 在我的答案下方评论的那样,“... interface builder 中似乎存在错误...”,我不完全确定它是否确实存在错误,但似乎是因为评论得到了几票赞成。 ;)
iOS7 在透明单元格背景方面肯定有问题。我希望我的回答能帮助和我面临类似情况的其他人。
这不是为您的 tableview 创建单元格的正确方法,尤其是在您使用 Interface Builder/Storyboards 时。在代码片段中,每次要求您的委托人提供一个新单元格时,您都会创建一个新单元格,这不是重用!要获得单元重用的性能优势,您应该使用 cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]。在早期版本中,您删除 indexPath 参数,然后测试 nil,根据您在 nil 情况下的代码片段使用 initWithStyle:reuseIdentifier 进行实例化。
ikuramedia:我在帖子中留下了重用代码。当然,我重复使用单元格。这不是这篇文章的重点。
K
Kjuly

斯威夫特 1.2 解决方案:

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

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

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

    return cell
}

对不起。是我的错。有用。我错过了其他一些设置。
m
mllm

对我来说,在 tableView:willDisplayCell:forRowAtIndexPath:tableView:cell:forRowAtIndexPath: 中设置 cell.backgroundColor = cell.contentView.backgroundColor; 就可以了。

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


D
DrBug

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


内容视图在以前的 SDK 版本中也可用,您只需为覆盖单元格背景视图的内容视图设置背景颜色。
好吧,它不会在 xcode 5 之前的界面生成器中自动弹出。你的意思是什么?
我的意思是,您的回答讨论了另一个问题,而不是我的问题。您只想为单元格设置背景颜色,对吗?因此,无论单元格在 iOS 7 中是否默认具有白色背景,您始终可以通过为内容视图设置颜色来实现它,因为内容视图覆盖在单元格的背景视图上。说得通? ;)
K
Kjuly

有类似的问题,不得不

将蓝色设置为 selectionStyle 并将其添加到代码中以更正它覆盖 func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { var bgColorView: UIView = UIView() bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), 绿色: (161.0 / 255.0), 蓝色: (255.0 / 255.0), alpha: 1.0) bgColorView.layer.masksToBounds = true tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView return true }


P
P.J.Radadiya

您还可以使用颜色代码来使您的 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];
}