在普通样式表视图上设置 UITableViewCell 背景颜色?

Posted

技术标签:

【中文标题】在普通样式表视图上设置 UITableViewCell 背景颜色?【英文标题】:Set UITableViewCell background color on plain style table view? 【发布时间】:2009-06-12 17:29:37 【问题描述】:

我正在构建一个带有搜索栏的普通样式表视图,但我无法在 Apple 的表视图中复制“排水沟”(当表视图被向下拖动时)的外观。

Contacts screenshot http://img200.imageshack.us/img200/2633/picture5m.png

如果我设置表格视图的背景颜色,装订线看起来不错,但我的单元格使用该颜色作为背景颜色。

我尝试在tableView:cellForRowAtIndexPath: 中设置单元格和单元格内容视图的背景颜色,但稍后会被覆盖。我还尝试创建一个空视图并将其设置为单元格的 backgroundView 和 contentView 的子视图,但只有边缘是白色的。

我能想到两种解决方案:

将我的 UITableViewController 子类转换为 UIViewController 并在表格视图后面插入一个空白视图。 创建一个不允许覆盖 backgroundColor 的 UITableViewCell 子类。

这两种解决方案都需要大量工作。有没有更简单的方法?

更新:第一个解决方案不起作用。我必须将表格视图的背景颜色设置为 clearColor 才能使装订线更改为视图的颜色。但是,当我这样做时,我得到的结果与在表格视图上设置 backgroundColor 相同。

【问题讨论】:

“但它会在稍后的某个时间点被覆盖”是什么意思?什么会覆盖它? 一个内部 UIKit 方法在调用 cellForRowAtIndexPath 和在屏幕上绘制视图以及用户可以与应用程序交互之间的某个时间覆盖它。 【参考方案1】:

有一个名为-tableView:willDisplayCell:forRowAtIndexPath: 的委托方法可用于在表格视图进行修改后自定义单元格的背景颜色。来自UITableViewDelegate reference:

表格视图在使用单元格绘制行之前将此消息发送给其委托人,从而允许委托人在单元格对象显示之前对其进行自定义。此方法使委托有机会覆盖先前由表视图设置的基于状态的属性,例如选择和背景颜色。代理返回后,表格视图仅设置 alpha 和 frame 属性,然后仅在行滑入或滑出时设置动画。

此外,由于在尝试滚动经过最后一个单元格时背景颜色会从表格底部露出来,因此我必须创建一个页脚视图并更新表格视图的内容插图:

UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
footerView.backgroundColor = [UIColor whiteColor];
self.tableView.tableFooterView = footerView;
[footerView release];

UIEdgeInsets inset = self.tableView.contentInset;
inset.bottom = 44 - footerView.frame.size.height;
self.tableView.contentInset = inset;

【讨论】:

这是迄今为止我找到的最好的解决方案,但必须有更清洁的方法。页脚意味着正常的“空单元格”不会出现在您的 tableView 中。空白区域将是纯白色(或您选择的任何颜色)。 inset.bottom 也不需要额外的 44 像素。这将在 tableView 的底部留下一个空白的排水沟。 inset.bottom = -footerView.frame.size.height 使 tableView 的“底部”成为最后一行。使用“淡入淡出”动画样式删除单元格时,您会看到单元格消失时闪烁的颜色。所以总是使用“顶部”或“底部”等。 今天早上我恍然大悟。有一个更简单和更清洁的解决方案。无需更改颜色和设置单元格背景的所有循环跳跃,只需创建一个类似于上面描述的 footView 的 tableHeaderView,其中包含 searchBar。完美运行。没有混乱。别大惊小怪。不过,它似乎仍然是一个 hack 解决方案。只是一个较小的 hack。【参考方案2】:

通常我在显示表格视图时一直在使用多个视图控制器。我使用 UIViewController 子类来控制整个视图和任何条形或按钮(任何与表格视图无关的东西)。然后我创建一个 UITableViewController 来只控制表格。

这有几个效果:

首先,它可以让我更好地封装行为。 UITableViewController 更加简洁和便携。

其次,您将获得一个真正的 UIView 来处理您遇到的问题等问题。这似乎需要更多的工作,但允许更大的定制。你可以为背景做任何你想做的事情。

第三,它使我可以更轻松地将 XIB 用于主视图,而不必担心 UITableView 内容(可能是网络加载或未加载,或者有其他加载问题)。

所以我的建议是您的第一个解决方案。但是你应该一直这样做,而不仅仅是当你认为你需要额外的灵活性时。这样它就已经到位了。

【讨论】:

【参考方案3】:

只需将您的 Tableview 和搜索栏放入 UIView(使 UITableViewController 成为 UIViewController),然后在 IB 或代码中将视图背景设置为您想要的颜色。

【讨论】:

【参考方案4】:
UIView *myView = [[UIView alloc] initWithFrame:cell.frame];
myView.backgroundColor = [UIColor colorWithRed:214.00/255.00 green:233.00/255.00 blue:247.00/255.00 alpha:1.0];
cell.backgroundView = myView;
[myView release];

【讨论】:

以上是关于在普通样式表视图上设置 UITableViewCell 背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将 UITableView 样式从普通转换为组 [重复]

在UITableViewCell上设置编辑样式而不重新加载单元格

使用Swift中的Parse删除表视图单元格

查询没有使用视图索引,而是使用普通表主键索引

如何以普通样式隐藏在 UITableView 中显示的空 UITableViewCells - IOS?

AngularJS正确路由视图但样式表损坏