通过单元格重用错误绘制的 UITableView 分隔符?

Posted

技术标签:

【中文标题】通过单元格重用错误绘制的 UITableView 分隔符?【英文标题】:UITableView separators drawn incorrectly through cell reuse? 【发布时间】:2012-04-03 14:20:12 【问题描述】:

我正在开发一个带有情节提要的 ios 5 项目,因此在 IB 中使用动态表格单元格原型。在其中一个视图中,我有一个带有可变高度单元格的表格视图,单元格高度是根据内容的高度计算得出的。

tableView:heightForRowAtIndexPath: 在表格视图首次显示时为所有单元格返回正确的值。向下滚动一些项目时一切都很好,但随后出现了问题:实际的单元格似乎是正确的高度,包括它们的触摸区域,但它们的分隔符呈现在错误的位置(在单元格内部而不是它们之间)。

从测量分隔符的位置来看,似乎细胞重复使用可能与此有关。前三个单元格的分隔符正确呈现,但第四个单元格不正确。 heightForRowAtIndexPath: 为其返回正确的高度(在本例中为 125 像素),并且其包含的子视图都在正确的位置。但是,分隔符仅呈现距离前一个分隔符 108 像素的位置,将其放置在单元格的 125 像素高区域内。

这里是关键:108px 是第一个表格单元格的高度,现在看不到并且可能被重复使用。我没有明确的证据,但似乎表格视图忽略了这些单元格的heightForRowAtIndexPath:,只是根据重用的单元格高度呈现分隔符。

这并不能解释为什么后来一堆更短的单元格根本不呈现分隔符。但这就是我所要做的。

是否有解决方法、IB 设置或其他可能有帮助的方法?

【问题讨论】:

我放弃了。我最终从表格视图属性中禁用了分隔符,并在单元原型的底部添加了一个 1px 高的视图作为分隔符。现在至少看起来不错。我仍然想知道为什么它行为不端,所以仍然非常欢迎回答。 我的可变高度表格视图也有这个问题......而且我正在以编程方式完成这一切。哦,好吧,至少我不需要这些线条,但它仍然令人困惑:/ 只是确认一件事,您是使用 tableView 分隔符还是添加 line/UIView 作为分隔符? 【参考方案1】:

我遇到了同样的问题,分隔符显示在看似随机的位置。

原来问题是我覆盖了layoutSubviews,但忘记调用[super layoutSubviews]。添加该调用为我解决了这个问题。

【讨论】:

【参考方案2】:

我也遇到了这个奇怪的问题。对于自定义表格单元格,添加一个图层作为分隔符可能是更好的选择。

在自定义表格单元类的initWith***方法中:

separator = [CALayer layer];
separator.backgroundColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
[self.layer addSublayer:separator];

在 layoutSubviews 方法中更新分隔符的框架:

- (void)layoutSubviews 
   CGFloat height = 1.0f;
   separator.frame = CGRectMake(0.0f, self.frame.size.height - height, self.frame.size.width, height);
   [super layoutSubviews];

【讨论】:

赞成为有帮助,但我会暂时保留已解决的复选标记,以防有人对行为本身有解释。

以上是关于通过单元格重用错误绘制的 UITableView 分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 单元重用导致 NSTimer 问题

单元格重用后 UITableView 不更新 UIButton

UITableView - 在编辑模式下重用单元格

UITableView 单元格中的可重用单元格存在问题

UITableView 和单元格重用

UITableView - 通过点击现有单元格插入新行