删除TableView中单个cell的分割线

前言

在iOS开发中,我们最常使用的UIKit控件之一就是UITableView,默认情况下我们可以通过UITableView的separatorStyle属性来更改所有cell的分割线样式,但是有时我们会遇到需要更改单独一个cell的分割线的需求,比如删除最下面一行cell的分割线,这是separatorStyle属性就不能满足要求了。为了达到目的我们可以采用的方法之一是将separatorStyle设置成为UITableViewCellSeparatorStyleNone,去掉默认的分割线,然后自定义cell,手动在需要的行添加分割线,这么做灵活性很高,适用于各种UITableView的使用场景。

上面提到的方法在某些简单的场景中显得过于复杂,比如用于不可滚动的TableView中。本文将介绍另一种实现此需求的简单方法。

实现思路

本方法是通过调整UITableViewCell的separatorInset属性来实现删除单个cell的分割线。

在iOS7之前可以通过增大分割线左侧的inset使整个分割线移出屏幕,但是到了iOS8及以后的版本中,系统不再允许将分割线移出屏幕,因此我们必须另想其他方法。因为UITableViewCell的separatorInset可以同时设置分割线左端和右端的inset,因此当我们将两端的inset分别设置为整个cell宽度的一半时,就会将中间的分割线的宽度压缩至0,此时相当于将该cell的分割线删除。

实现方法

因为此方法是根据当前cell宽度来计算并压缩分割线的,所以要考虑到当cell宽度改变时,比如orientation改变,需要重新计算inset的宽度,所以我们将在viewWillLayoutSubviews中进行处理,实现如下:

1
2
3
4
5
6
7
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];

//除去最后一个TableViewCell下方的分割线
UITableViewCell *cell = [self.tableView.visibleCells lastObject];
cell.separatorInset = UIEdgeInsetsMake(0, CGRectGetWidth(cell.bounds)/2.0, 0, CGRectGetWidth(cell.bounds)/2.0);
}

本文个人博客地址: http://wty.im/2016/03/21/delete-tableview-separator-for-a-single-cell/
Github: https://github.com/wty21cn/