objective-c - 创建多条画线

标签 objective-c ios

所以我需要画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” 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:方法(CGPoint不是对象,因此必须弄清楚如何将它们包括在字典中)。

因此这将循环并创建n行。

最佳答案

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

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

您不必在每次绘制线条时都复制全部内容,只需重复这两行代码即可。

关于objective-c - 创建多条画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991313/

相关文章:

ios - 自定义字体在 Xcode 中不起作用

ios - XCode:预期标识符或 '('

ios - 使用图表创建的条形图上仅出现一个标签

ios - 如何使用 Xcode 5 本地化我的应用程序?

ios - 在 Xcode 6 中,使用 UIPinchGestureRecognizer 中的值缩放图像差异中的值

objective-c - 在 SceneKit 下可靠地访问和修改捕获的相机帧

objective-c - Objective-C 中的后代枚举

javascript - 在 Objective C 中执行 js

ios - Xcode 段 Controller 错误

ios - 在将应用提交到Apple Store时,IAP verifyReceipt URL应该是沙箱还是在服务器上购买url?