首页 UITableView 隐藏部分类型 Cell 的分割线
文章
取消

UITableView 隐藏部分类型 Cell 的分割线

问题

最近项目中遇到同一个 UITableView 第一分区的列表是 卡片样式 不需要分割线, 但是第二分区的样式是 普通样式 , 需要 分割线.

以往有 2 种的做法是:

第一种: 自己绘制分割线

1
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

然后在需要分割线的 Cell 中自己划线, 但是 区首区尾 的分割线宽度是 屏幕宽度 , 其他 Cell 的分割线跟屏幕有 15 的间隔. 这时候就需要区分区首和区尾来进行不同的绘制处理 (也可能是 CALayer/UIView).

一般来说部推荐使用 drawRect: 进行绘制.

第二种: 配置相关属性

对不需要分割线的 Cell 进行如下修改:

1
cell.separatorInset = UIEdgeInsetsMake(0, SCREEN_WIDTH, 0, 0);

此种处理办法虽然可以一定程度上解决我们的问题, 但是 HeaderFooter 的分割线无法取消. UITableViewCell 的实例对象中, 一般的 Cell 只有 1 条分割线, 区首的 Cell2 根分割线, 顶部分割线 & 底部分割线. 通过 valueForKey: 使用 _topSeparatorView, _separatorView 可以分别获取到分割线对象. 但是要在合适的时机, init 方法内是无法获取到的. 经测试, 顶部的 Cell 总是会被复用再第一个位置 (目前测试是这样的), 还未测出其他情况.

因此对 _topSeparatorView_separatorView 设置 hidden = YES 可以解决掉 Header 的底部分割线和一般 Cell 的分割线, 区尾的分割线无法隐藏 (原因未知), 使用 Debug View 也找不到底部分割线.

解决办法

通过遍历 UITableViewmethodList 发现有如下方法:

1
- (void)setSeparatorColor:(id)arg1;

该方法是设置分割线颜色的方法, 如果让此方法失效, 分割线会是什么颜色呢?

尝试重写该方法为空实现:

1
- (void)setSeparatorColor:(id)arg1 {}

结果来看, 成功解决了 Cell, Header, Footer 的分割线. 目前应该是最简单的处理方法.

  1. 不用自己绘制.
  2. 处理彻底.
  3. 操作简单.

如果你页游这样的问题, 可以使用这个方法试一下.

其他提示- (void)setSeparatorColor:(id)arg1 中, 传入的 arg1 类型为 UIDeviceRGBColor 类型. 通过 super 调用 setSeparatorColor: 会死循环.

本文由作者按照 CC BY 4.0 进行授权