为什么UITableView在使用自定义separatorInset的“额外”分隔符时忽略了separatorColor?

11

在iOS 7中,如果我在一个表格视图上设置了红色的separatorColor并将separatorInset设置为UIEdgeInsetsZero或任何其他自定义插图值,则所有额外的行都有默认颜色的分隔线。如何解决这个问题?

separatorInset文档的最后一句话意味着它以某种方式控制了额外的记录,但我不知道怎么做:

 

在iOS 7及更高版本中,单元格分隔符不会延伸到表视图的边缘。此属性为表格中所有单元格设置默认插图,就像rowHeight设置单元格的默认高度一样。它还用于管理明显风格表格底部绘制的“额外”分隔符。

请在viewDidLoad中设置分隔符:

self.tableView.separatorColor = [UIColor redColor];

然后你会得到这个:

enter image description here

并且当你设置separatorInset和颜色时:

self.tableView.separatorInset = UIEdgeInsetsZero;    // <- any custom inset will do
self.tableView.separatorColor = [UIColor redColor];

你会看到这个:

enter image description here

为什么会这样,我该如何使所有的分隔符都变为红色并将所有分隔符插图设为零?这是一个错误吗?


相同的问题似乎会发生在任何自定义的separatorInset上,而不仅仅是UIEdgeInsetsZero。幸运的是,接受的解决方案也适用于任何自定义的separatorInset。谢谢! - Hilton Campbell
好的,谢谢提醒。我已经更新了问题并包含了这个内容。 - Aaron
2个回答

21

解决了,但我无法解释为什么。

交换两个语句的顺序。先设置颜色,然后再设置插入效果:

self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;

一切正常:

在此输入图片描述


1
是的。您能告诉我们为什么您的答案不是黑客行为吗?它没有解释为什么颜色没有被尊重。 - Aaron
@AustinMarusco 这不是黑客攻击,显然这是iOS的一个bug,如果在应用新样式后更改颜色,则不会重新绘制分隔符。 - pronebird
所以你的意思是,除了我回答中的代码之外,你必须在cellForRowAtIndexPath中添加代码,那么这就不是一个hack了吗?如何添加冗余的separatorInset调用不是hack呢? - Aaron
我承认这两个答案都是hack,但我认为这个更糟糕。改变这两个语句的顺序不应该改变结果,除非在当前运行循环期间重新渲染屏幕(使用layoutSubviews)。总的来说,如果有人事后来编辑你的代码,如果顺序对于简单的UI属性很重要,他们会更容易破坏它。 - Austin Marusco
1
只需在代码上方添加一条注释即可解决。 - Ian Dundas

2
尝试将以下内容添加到cellForRowAtIndexPath中,除了设置tableView的separatorInsets之外。 cell.separatorInset = UIEdgeInsetsZero; 来自UITableViewCell iOS文档:
@property(nonatomic)UIEdgeInsets separatorInset
单元格内容的插入值。
您可以使用此属性在当前单元格的内容和表格左右边缘之间添加空间。正插入值将单元格内容和单元格分隔符向内移动并远离表格边缘。负值被视为插图设置为0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接