0

我不敢相信我在问经典的“我如何画线”问题,但它比这更复杂一些。

我有一个分组的 tableview,我已将它的 separatorColor 设置为清除。这将删除边框和分隔符。我在 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);
}

在此处输入图像描述

4

1 回答 1

1

首先,使用类别覆盖框架类的方法是个坏主意。您所做的会影响UITableViewCell应用程序中的每个实例。您不直接对应用程序中的每个表格视图单元负责!例如,aUIPickerView具有嵌入的表视图,aUIDatePicker具有嵌入的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
于 2013-05-02T21:36:09.137 回答