所以我需要绘制2条不同的线条。通过另一个posting,我想出了如何重绘一条线。我的问题是,如果我想绘制2行,我需要有2个代码段来做吗?或者有没有办法绘制n行?
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"drawRect called");
CGContextSetLineWidth(context, self.lineWidth);
CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
CGContextMoveToPoint(context, self.startPoint.x, self.startPoint.y);
CGContextAddLineToPoint(context, self.endPoint.x, self.endPoint.y);
CGContextStrokePath(context);
}
实施
draw2D *myCustomView = [[draw2D alloc] init];
myCustomView.startPoint = CGPointMake(0, 0);
myCustomView.endPoint = CGPointMake(300, 300);
myCustomView.lineWidth = 5;
myCustomView.lineColor = [UIColor redColor];
myCustomView.frame = CGRectMake(0, 0, 500, 500);
[myCustomView setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:myCustomView];
[myCustomView setNeedsDisplay];
myCustomView.endPoint = CGPointMake(100, 100);
myCustomView.lineColor = [UIColor orangeColor];
[myCustomView setNeedsDisplay];
这只会重新划线。我会为我想要的每一行重复drawRect块吗?所以,如果我想要两条线,我必须这样做:
- (void)drawRect:(CGRect)rect
{
//line1
CGContextRef context1 = UIGraphicsGetCurrentContext();
NSLog(@"drawRect called");
CGContextSetLineWidth(context1, self.lineWidth1);
CGContextSetStrokeColorWithColor(context1, self.lineColor1.CGColor);
CGContextMoveToPoint(context1, self.startPoint1.x, self.startPoint1.y);
CGContextAddLineToPoint(context1, self.endPoint1.x, self.endPoint1.y);
CGContextStrokePath(context1);
//line 2
CGContextRef context2 = UIGraphicsGetCurrentContext();
NSLog(@"drawRect called");
CGContextSetLineWidth(context2, self.lineWidth2);
CGContextSetStrokeColorWithColor(context2, self.lineColor2.CGColor);
CGContextMoveToPoint(context2, self.startPoint2.x, self.startPoint2.y);
CGContextAddLineToPoint(context2, self.endPoint2.x, self.endPoint2.y);
CGContextStrokePath(context2);
}
还是有更好的方法来处理我的线条?
编辑:最终目标是将UIView
与标签和文本框一起使用,我将其用作表单。我想要线条来分解表格。
我想知道我是否应该只使用这些自定义draw2D UIView
作为行并将它们放在UIView
表单的顶部,然后我可以创建多个“draw2D”{{1 }}?
解决方案:
所以这里是我认为可行的代码:
UIViews
我在创建用于测试的数组时包含了我的initWithFrame:方法(CGPoint不是对象,因此必须弄清楚如何将它们包含在字典中)。
所以这将循环并创建n行。
答案 0 :(得分:5)
您可以根据需要多次重复此位(每次显示不同的坐标)。
CGContextMoveToPoint(context, self.startPoint.x, self.startPoint.y);
CGContextAddLineToPoint(context, self.endPoint.x, self.endPoint.y);
第一行代码设置行的起点,第二行代码绘制它。您无需重复所有其余代码。
换句话说,你可以画出这样的多行:
//set up context
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, self.lineWidth1);
CGContextSetStrokeColorWithColor(context, self.lineColor1.CGColor);
//line1
CGContextMoveToPoint(context, self.startPoint1.x, self.startPoint1.y);
CGContextAddLineToPoint(context, self.endPoint1.x, self.endPoint1.y);
//line 2
CGContextMoveToPoint(context, self.startPoint2.x, self.startPoint2.y);
CGContextAddLineToPoint(context, self.endPoint2.x, self.endPoint2.y);
//line 3
etc...
//finished drawing
CGContextStrokePath(context);
每次画线时都不需要复制整批,你可以重复这两行代码。
答案 1 :(得分:0)
好吧,你可以将重复的代码重构成另一个方法并传入绘制一条线所需的变量,即上下文,颜色,起点和终点,宽度
答案 2 :(得分:0)
更好,更普遍的方式是:
- (void)drawRect:(CGRect)rect:(long)lineWidth:(CGColor)color:(CGPoint)pStart:(CGPoint)pEnd
{
//line1
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"drawRect called");
CGContextSetLineWidth(context, lineWidth);
CGContextSetStrokeColorWithColor(context, color);
CGContextMoveToPoint(context, pStart.x, pStart.y);
CGContextAddLineToPoint(context, pEnd.x, pEnd.y);
CGContextStrokePath(context);
}
...
[self drawRect:rect:self.lineWidth1:self.lineColor1.CGColor:self.startPoint1:self.endPoint1];
[self drawRect:rect:self.lineWidth2:self.lineColor2.CGColor:self.startPoint2:self.endPoint2];
...