tableView分割线的indexPath

在写项目时候,tableView的分割线一般都会自定义,我采取的方法是为UITableView额外的添加一个叫

1 - (BOOL)tableView:(UITableView *)tableView borderForRowAtIndexPath:(NSIndexPath *)indexPath;

的协议方法,说起这个协议方法,我一般都是在搭建项目框架时候,都会写一个tableView的基类,也会自定义一个cell的基类,在基类中制定一个继承于

UITableViewDataSource, UITableViewDelegate的协议,然后在子类中重载tableView的协议方法,而上面的borderForRowAtIndex:就是这个协议的协议方法,

在tableView的基类.h文件中代码:

 1 @protocol CardViewDelegate;
 2
 3 @interface CardView : UITableView
 4
 5 @property (nonatomic, assign)id<CardViewDelegate>cardViewDelegate;
 6
 7 @end
 8
 9 @protocol CardViewDelegate <UITableViewDataSource, UITableViewDelegate>
10
11 @optional
12 - (BOOL)tableView:(UITableView *)tableView borderForRowAtIndexPath:(NSIndexPath *)indexPath;
13
14 @end

这个borderForRowAtIndex:方法的实现:

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 2 {
 3     UITableViewCell *cell = nil;
 4     if (self.cardViewDelegate && [self.cardViewDelegate respondsToSelector:@selector(tableView:cellForRowAtIndexPath:)]) {
 5         cell = [self.cardViewDelegate tableView:tableView cellForRowAtIndexPath:indexPath];
 6     }
 7     if ([cell isKindOfClass:[CardCell class]]) {
 8         CardCell *cardCell = (CardCell *)cell;
 9         BOOL border = YES;
10         if (self.cardViewDelegate && [self.cardViewDelegate respondsToSelector:@selector(tableView:borderForRowAtIndexPath:)]) {
11             border = [self.cardViewDelegate tableView:tableView borderForRowAtIndexPath:indexPath];
12         }
13         cardCell.borders = border;
14     }
15
16     return cell;
17 }

在自定义cell基类中,实现如下代码:

 1 - (void)drawRect:(CGRect)rect {
 2     CGContextRef context = UIGraphicsGetCurrentContext();
 3     if (self.borders == YES) {
 4
 5         CGContextMoveToPoint(context, CGRectGetMinX(rect) + 10, CGRectGetMaxY(rect));
 6         CGContextAddLineToPoint(context, CGRectGetMaxX(rect) - 10, CGRectGetMaxY(rect));
 7     }
 8     else if (self.borders == NO){
 9
10     }
11     CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor] );
12     CGContextSetLineWidth(context, 0.5f);
13     CGContextStrokePath(context);
14 }
15 - (void)setBorders:(BOOL)borders {
16     if (_borders != borders) {
17         _borders = borders;
18         [self setNeedsDisplay];
19     }
20 }

那么在当前的UITableView中,去重载borderForRowAtIndex:方法:

1 - (BOOL)tableView:(UITableView *)tableView borderForRowAtIndexPath:(NSIndexPath *)indexPath {
2     if (indexPath.row == 0) {
3         return YES;
4     }
5     else {
6         return NO;
7     }
8 }

到这里,设置indexPath的值,就可以控制哪个cell的分割线是否出现,其实这种做法是简易的去返回BOLL的YES或NO去实现,那么我在实际项目中不会这么写,因为单单的YES or NO太单一了,我会写成

1 - (NSInteger)tableView:(UITableView *)tableView borderForRowAtIndexPath:(NSIndexPath *)indexPath;

其中它返回的值是枚举类型

 1 typedef NS_ENUM(NSInteger, Border) {
 2     TOP = 0x00000001,
 3     LEFT = 0x00000002,
 4     RIGHT = 0x00000004,
 5     BOTTOM = 0x00000008,
 6
 7     TOP_WITH_MARGIN = 0x00000010,
 8     BOTTOM_WITH_MARGIN = 0x00000020,
 9
10     NONE = 0x10000000,
11
12 };

这样的写法无疑可以设置的余地大大增加了

时间: 2024-08-13 22:52:58

tableView分割线的indexPath的相关文章

关于对tableView分割线的处理

都知道,苹果自带tableView分割线不是整个屏幕宽度的.很多时候,需求让分割线等于屏幕宽度,就需要进行一些设置. 一.storyboard中: 对静态tableView的设置,选中tableView,在右侧会有下面的选项. 图中红色部分,就是设置分割线的左右间距.但是很遗憾,当left为0时,与屏幕宽度还是差了一点点.于是,需要进行代码设置 二.代码设置 在tableView中,加入以下代码,即可 -(void)viewDidLayoutSubviews{    if ([self.tabl

iOS tableView分割线高度自定义

1.系统自带的集中分割线的形式 myTableView.separatorStyle=UITableViewCellSeparatorStyleNone;(这个是去掉所有分割线)可以通过这个来设置 2.另外设置自定义的cell 首先通过myTableView.separatorStyle=UITableViewCellSeparatorStyleNone这个方法去掉所有的cell,然后在重载cell的drawRect方法,通过Quartz 2D技术直接进行绘制,思路如下,首先绘制整个cell的背

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath不执行的问题

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath不执行基本上只有3个原因 1. delegate没设,一定要有self.tableView.delegate = self 2. section,row的个数返回为0,或者有冲突 3. tableView的frame有问题,比如位(0,0,0,0) 我遇到的问题比较奇葩,因为我喜欢在代码里添加约

解决tableView分割线左边不到边的情况

//解决tableView分割线左边不到边的情况//    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {//        [tableView setSeparatorInset:UIEdgeInsetsZero];//    } 解决tableView分割线左边不到边的情况

swift 一句代码补全tableView分割线

1.swift实现分割线补全 swift一个大进步,只要设置tableView.separatorInset = UIEdgeInsets.zero即可补全分割线, 2.OC实现分割线补全 而在OC中,我们要实现UITableViewDelegate的两个代理方法才能得到想要的效果.OC实现代码如下 - (void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSeparatorInset:

oc TableView 分割线(separator)显示问题

问题:当TableView的cell不能显示完整个屏幕(屏幕有剩余),则没有显示cell的地方会显示分割线.而正常情况下,如果没有cell则应没有分割线.如下图所示:左图为遇到问题,右图为想要的结果 解决方法: 1 我们可以通过代码禁止所有的cell显示分割线,即 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;然后再自定义cell,在cell里面添加一条线. 不过这种太麻烦 2 利用设置Separator边界可

ios8 解决tableview分割线缺少的15像素

在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setSeparatorInset:UIEdgeInsetsZero 已经不起作用了.下面是解决办法 首先在viewDidLoad方法加入以下代码: if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.

解决tableView分割线左边不到边

//分割线不到边 - (void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero];     } if ([self.tableView respondsToSelector:@selecto

iOS 解决tableView分割线从边框顶端开始

1.直接把tableView设置成self.tableView.separatorStyle =UITableViewCellSeparatorStyleNone.然后自定义cell那里自己加一个view,高度为1,颜色自己设置. 2.添加这两个方法 -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setS