我无法相信我会问经典的“我如何画一条线”的问题,但它比这更复杂。
我有一个分组的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);
}
答案 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