创build多个画线

所以我需要画两条不同的线。 通过另一个post ,我想出了如何重画一条线。 我的问题是,如果我想绘制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); } 

还是有更好的方法来处理我的线条?

编辑:最终目标是使用它与标签和文本框我用作一种forms的UIView 。 我要线条分解forms。

我想知道如果我应该只使用这些自定义draw2D UIView作为行,并将它们放在UIView窗体上,那么我可以创build多个“draw2D”UIViews?

解:

所以这里是我想到的代码将工作:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code NSMutableArray *tempArray = [[NSMutableArray alloc] init]; NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init]; [tempDict setValue:[NSValue valueWithCGPoint:CGPointMake(10, 10)] forKey:@"start"]; [tempDict setValue:[NSValue valueWithCGPoint:CGPointMake(500, 500)] forKey:@"end"]; [tempArray addObject:tempDict]; NSMutableDictionary *tempDict2 = [[NSMutableDictionary alloc] init]; [tempDict2 setValue:[NSValue valueWithCGPoint:CGPointMake(400, 10)] forKey:@"start"]; [tempDict2 setValue:[NSValue valueWithCGPoint:CGPointMake(500, 500)] forKey:@"end"]; [tempArray addObject:tempDict2]; self.pointArray = [NSArray arrayWithArray:tempArray]; } return self; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, self.lineWidth); CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); for (int i = 0; i < [self.pointArray count]; i++) { CGPoint tempPoint = [[[self.pointArray objectAtIndex:i] objectForKey:@"start"] CGPointValue]; CGPoint tempPoint2 = [[[self.pointArray objectAtIndex:i] objectForKey:@"end"] CGPointValue]; CGContextMoveToPoint(context, tempPoint.x, tempPoint.y); CGContextAddLineToPoint(context, tempPoint2.x, tempPoint2.y); } CGContextStrokePath(context); } 

我包含了我的initWithFrame:创build用于testing的数组的方法(CGPoint的不是对象,所以必须弄清楚如何将它们包含在字典中)。

所以这将循环并创buildn行。

您可以根据需要多次重复该位(每次显然都有不同的坐标)。

 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); 

每当你画一条线时,你不需要复制整个图片,你可以重复这两行代码。

那么,你可以将重复的代码重构成另一个方法,并传入绘制线所需的variables,即上下文,颜色,起点和终点,宽度

更好和普遍的方法是:

 - (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];