在写项目时候,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,
};
这样的写法无疑可以设置的余地大大增加了