tableView分割线的indexPath

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

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

的协议方法,说起这个协议方法,我一般都是在搭建项目框架时候,会写一个tableView的基类,也会自定义一个cell的基类,在基类中制定一个继承于UITableViewDataSource, UITableViewDelegate的协议,然后在子类中重载tableView的协议方法,而上面的borderForRowAtIndex:就是这个协议的协议方法,在tableView的基类.h文件中代码:

 @protocol CardViewDelegate; 

 @interface CardView : UITableView

 @property (nonatomic, assign)idcardViewDelegate; 

 @end 

 @protocol CardViewDelegate

这个borderForRowAtIndex:方法的实现:

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

 {

     UITableViewCell *cell = nil;

     if (self.cardViewDelegate && [self.cardViewDelegate respondsToSelector:@selector(tableView:cellForRowAtIndexPath:)]) {

        cell = [self.cardViewDelegate tableView:tableView cellForRowAtIndexPath:indexPath];

     }

     if ([cell isKindOfClass:[CardCell class]]) {

         CardCell *cardCell = (CardCell *)cell;

         BOOL border = YES;

         if (self.cardViewDelegate && [self.cardViewDelegate respondsToSelector:@selector(tableView:borderForRowAtIndexPath:)]) {

             border = [self.cardViewDelegate tableView:tableView borderForRowAtIndexPath:indexPath];

         }

         cardCell.borders = border;

     }

     return cell;

 }

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

 - (void)drawRect:(CGRect)rect {

     CGContextRef context = UIGraphicsGetCurrentContext();

     if (self.borders == YES) {

        CGContextMoveToPoint(context, CGRectGetMinX(rect) + 10, CGRectGetMaxY(rect));

         CGContextAddLineToPoint(context, CGRectGetMaxX(rect) - 10, CGRectGetMaxY(rect));

     }

    else if (self.borders == NO){

     }

     CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor] );

     CGContextSetLineWidth(context, 0.5f);

     CGContextStrokePath(context);

 }

 - (void)setBorders:(BOOL)borders {

     if (_borders != borders) {

         _borders = borders;

         [self setNeedsDisplay];

     }

 }

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

 - (BOOL)tableView:(UITableView *)tableView borderForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 0) {

        return YES;

     }

     else {

         return NO;

     }

 }

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

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

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

 typedef NS_ENUM(NSInteger, Border) {

     TOP = 0x00000001,

     LEFT = 0x00000002,

     RIGHT = 0x00000004,

     BOTTOM = 0x00000008,

     TOP_WITH_MARGIN = 0x00000010,

     BOTTOM_WITH_MARGIN = 0x00000020,

     NONE = 0x10000000,

 };

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

你可能感兴趣的:(tableView分割线的indexPath)