UITableView 的单元格分隔符在滚动后消失

Posted

技术标签:

【中文标题】UITableView 的单元格分隔符在滚动后消失【英文标题】:UITableView's cell separator disappears after scrolling 【发布时间】:2012-10-31 20:13:47 【问题描述】:

我有一个 UITableView 配置为“UITableViewStylePlain”,其分隔符样式为 UITableViewCellSeparatorStyleSingleLine。单元格具有背景颜色。

问题是,当您滚动表格视图时,一旦某些单元格从屏幕上消失并被带回来,分隔符就不再可见。

单元格注册到:

[tableView registerNib:nib forCellReuseIdentifier:cellIdentifier];

单元格代码:

- (void)customizeMyTable

    [self.tableView setDataSource:self];
    [self.tableView setDelegate:self];
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

    NSString *cellIdentifier = [MyTableViewCell cellIdentifier];
    UINib *nib = [UINib nibWithNibName:cellIdentifier bundle:nil];

    [self.tableView registerNib:nib forCellReuseIdentifier:cellIdentifier];
    self.tableView.rowHeight = 50;


- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    MyTableViewCell *cell = (MyTableViewCell*)[tableView dequeueReusableCellWithIdentifier:cellID];

    [cell configure:someDataForThisRow];

    return cell;


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

    cell.backgroundColor = [UIColor lightGrayColor];

有人遇到过这个问题吗?这似乎只发生在 ios 5 上,而不是 iOS 6 Tableviews。

【问题讨论】:

显示 tableview 的代表。 -(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 确保 tableView 的 rowHeight 是您的单元格的确切高度,或者您的单元格高度与 rowHeight 函数(在您的委托中)返回的高度完全匹配。 即使我也面临同样的问题。您找到解决方案了吗?这里没有一个解决方案对我有用。我在所有版本的 iOS 中都面临这个问题,直到 11.x 我实际上遇到了一个特殊的情况。当数据库返回空数组时,分隔符被删除。因此,即使在数据库不为零时重新添加分隔符后,分隔符也会丢失或出现两个分隔符。但我发现这是因为我使用的自定义单元格有一个背景颜色为灰色的容器视图。所以我修改它有白色。请检查您的自定义单元格的内容及其属性。 【参考方案1】:

如果您在自定义单元格中实现了layoutSubviews,并且您不小心忘记了调用相应的超级方法,您将看不到分隔线。

也许你应该检查一下你是否忘记在你的其他方法中调用 super。

- (void)layoutSubviews

    [super layoutSubviews]; //<-THIS LINE YOU NEED

    //own code continues here

【讨论】:

谢谢,对我有帮助【参考方案2】:

我必须将分隔符插入设置为 0 才能解决问题。

【讨论】:

这对我有用。最后一个(屏幕外)之前的单元格没有分隔符,当视图被回收时,其他单元格失去了分隔符。 (我准确地说出了我的问题,因为分隔符似乎有很多问题/解决方法)【参考方案3】:

我的问题也通过设置分隔符插入值 0 得到解决。

【讨论】:

【参考方案4】:

如果您动态构建 UITableViewCell 的内容,请确保将子视图添加到 contentView 而不是 self:

contentView.addSubview(subView)

而不是

self.addSubview(subView)

【讨论】:

【参考方案5】:

这和LED屏幕分辨率有关,因为实际设备的分辨率非常高,Monitor很难在屏幕上渲染那些微小的线条。它可以在实际设备上正常工作。 有人告诉我不要在意它。所以如果问题只出在模拟器上,你就可以了。

【讨论】:

【参考方案6】:

如果它对您来说很烦人,那么请创建一个自定义单元格并在其中添加一个分隔符,并通过以下方式从单元格中删除默认分隔符 对于 Obj.C: [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

否则你在真机上测试应该没问题。

【讨论】:

【参考方案7】:

我在 swif 中遇到了同样的问题。就我而言,我发现通过单击“按视图层次结构调试”按钮,滚动时新出现的单元格与其他单元格有一点重叠。这就是分隔线消失的原因。 所以解决方案很简单,在 cellForRowAtIndexPath clipsToBounds = true 中设置单元格返回,这样它就不会超出您指定的高度并与另一个单元格的分隔线重叠。

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cellView = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath)
    cellView.clipsToBounds = true //Add this line
    return cellView

【讨论】:

以上是关于UITableView 的单元格分隔符在滚动后消失的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 单元格在向下滚动然后备份后消失

uitableview手动滚动时单元格图像消失

在 UICollectionView/UITableView 中为滚动视图的偏移设置动画会导致单元格过早消失

一旦我开始滚动,我的带有自定义 xib 单元格的 UITableView 就会消失

滚动时 UITableView 复选标记消失

点击时表格视图单元格分隔线消失