问题描述:
在iOS的app开发中碰到这样的需求:
隐藏UITableView中相邻两个section的separator——即隐藏上方section最下面的separator,以及下方section最上面的seperator。
困难分析:
separator是UITableView的属性,而不是cell、section的属性(但相关属性定义在UITableViewCell.h中),因此无法直接修改seperatorStyle来达到目标。
解决的思路是,隐藏UITableView的separator
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
然后根据cell位置的不同,选择性地在cell中人为绘制separator
实现:
具体实现时有多种办法可供选择:
1. 在xib/storyboard文件中构造自定义cell,在data source中以如下方式进行复用
cell = [tableView dequeueReusableCellWithIdentifier:@"custom_cell"];
优点:思路清晰,实现简单
缺点:每个viewController都需要构造cell,而且界面和逻辑耦合严重。
2. 新建cell类,通过参数控制cell绘制separator的位置
cell = [[DriftyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil seperatorStyle:DriftyTableViewCellHideNoSeperator];
优点:逻辑与界面完全解耦,可定制化程度高
缺点:如果要在cell中加入其它元素,如textfield,就必须通过代码添加
3. 让xib/storyboard中的cell继承自定义cell类
优点:结合了xib可视化和代码可定制化的优点
缺点:实现遇到了bug。该思路需要重写自定义cell的initWithCoder方法,在该方法中初始化separotor的位置、颜色、粗细等等。然后在data source中可以
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell_B"];
但是实现出来发现separator只会在cell的两边出现(在公司贴不了图)。尝试后发现,修改xib文件中的cell背景,使其不是default即可正确显示,暂时不知道原理是什么。
第三种方式是目前采用的方式,在定制其他类型的控件时,也可以使用该方法,以减少代码量、提高控件的可定制度。