使用Core Graphics在标准分组tableView单元格上绘制分隔线

时间:2013-05-02 20:54:31

标签: iphone uitableview core-graphics

我无法相信我会问经典的“我如何画一条线”的问题,但它比这更复杂。

我有一个分组的tableview,其separatorColor我已设置为clear。这将删除边框和分隔符。我在UITableViewCell上也有一个类别,用于在单元格周围绘制一些渐变。

我希望能够在同一类别中绘制线条分隔符。以下是我到目前为止的情况:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);

float y = height;

CGContextMoveToPoint(ctx, CGRectGetMinX(rect), y);
CGContextAddLineToPoint(ctx, CGRectGetMaxX(rect), y);

CGContextSetStrokeColorWithColor(ctx, color.CGColor);
CGContextSetLineWidth(ctx, width);
CGContextStrokePath(ctx);

CGContextRestoreGState(ctx);

这样可行,但该行显示背后 tableView单元格。我想让它在细胞顶部可见。

我错过了什么?

谢谢!

编辑:截图

如果仔细观察,可以在边缘看到绿色像素。底部是完全可见的。

编辑2:代码

- (void)drawRect:(CGRect)rect {
     CGContextRef ctx = UIGraphicsGetCurrentContext();
     CGContextSaveGState(ctx);

     [self drawLineSeparator:self.contentView.frame];
}


- (void) drawLineSeparator:(CGRect)rect {
     [self drawLineAtHeight:CGRectGetMaxY(rect)
                  rect:rect
                 color:[UIColor colorWithRed:0 green:1 blue:0 alpha:.7]
                 width:1];
}


- (void) drawLineAtHeight:(float)height rect:(CGRect)rect color:(UIColor *)color width:(float)width {
     CGContextRef ctx = UIGraphicsGetCurrentContext();
     CGContextSaveGState(ctx);

     float y = height;

     CGContextMoveToPoint(ctx, CGRectGetMinX(rect), y);
     CGContextAddLineToPoint(ctx, CGRectGetMaxX(rect), y);

     CGContextSetStrokeColorWithColor(ctx, color.CGColor);
     CGContextSetLineWidth(ctx, width);
     CGContextStrokePath(ctx);

     CGContextRestoreGState(ctx);
}

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,使用类别覆盖框架类的方法是个坏主意。您所做的工作会影响您应用中UITableViewCell的每个实例。您不直接对应用中的每个表格视图单元格负责!例如,UIPickerView嵌入了表格视图,而UIDatePicker嵌入了UIPickerView。因此,如果您使用其中任何一种,您的类别可能会以您不期望或不想要的方式改变其外观。

相反,创建一个UITableViewCell的子类并覆盖子类中的drawRect:

其次,UITableViewCell使用子视图绘制其背景。子视图的内容始终是“超级视图”内容的“顶部”。所以你的绿线位于背景视图的内容之下。这就是你无法看到它的原因。

一个解决方法是简单地向单元格添加一个高点的绿色子视图。然后,您根本不必覆盖drawRect:。你甚至可以在你的细胞亚类中做到这一点。例如:

// MyCell.h

@interface MyCell : UITableViewCell
@end

// MyCell.m

#import "MyCell.h"

@implementation MyCell {
    UIView *greenLineView;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    [self layoutGreenLineSubview];
}

- (void)layoutGreenLineSubview {
    if (!greenLineView) {
        greenLineView = [[UIView alloc] init];
        greenLineView.backgroundColor = [UIColor greenColor];
        greenLineView.userInteractionEnabled = NO;
        [self.contentView addSubview:greenLineView];
    }
    CGRect frame = self.contentView.bounds;
    frame.origin.y = CGRectGetMaxY(frame);
    frame.size.height = 1;
    greenLineView.frame = frame;
}

@end