Рисование более одной линии / пути на iPhone с использованием массива точек - PullRequest
2 голосов
/ 23 октября 2011

Я пытаюсь создать чертежный вид, рисуя линии с использованием массива CGPoints.

В настоящее время я могу нарисовать более одной линии, но проблема в том, что я не знаю, как разбить каждую линию, когда касание закончено.

Текущий статус - линия1 рисуется до касания Когда сенсорный ввод снова начинается, линия 2 также рисуется, НО, конечная точка линии 1 связана с начальной точкой линии 2.

Реализация следующим образом:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSUInteger tapCount = [[touches anyObject] tapCount];
    if (tapCount == 2)
    {
        [pointArray removeAllObjects];
        [self setNeedsDisplay];
    }
    else
    {
        if ([pointArray count] == 0)
            pointArray = [[NSMutableArray alloc] init];
        UITouch *touch = [touches anyObject];
        start_location = [touch locationInView:self];
        [pointArray addObject:[NSValue valueWithCGPoint:start_location]];
    }
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    current_location = [touch locationInView:self];
    [pointArray addObject:[NSValue valueWithCGPoint:current_location]];
    [self setNeedsDisplay];    
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

}



-(void)drawRect:(CGRect)rect
{
    if ([pointArray count] > 0)
    {
        int i;
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
        for (i=0; i < ([pointArray count] -1); i++)
        {
            CGPoint p1 = [[pointArray objectAtIndex:i]CGPointValue];
            CGPoint p2 = [[pointArray objectAtIndex:i+1]CGPointValue];
            CGContextMoveToPoint(context, p1.x, p1.y);
            CGContextAddLineToPoint(context, p2.x, p2.y);
            CGContextStrokePath(context);
        }
    }
}

Пожалуйста, сообщите: -))

Заранее спасибо,

Дуди Шани-Габай

1 Ответ

0 голосов
/ 20 сентября 2012

В этом случае, я думаю, вам лучше хранить отдельные массивы для отдельных строк. Пусть "pointArray" будет массивом, содержащим количество массивов для каждой нарисованной линии.

В методе "touchesBegan" вам нужно добавить новый объект массива в pointArray следующим образом:

start_location = [touch locationInView:self];
NSMutableArray *newLineArray = [[NSMutableArray alloc] init];
[pointArray addObject:newLineArray];
[[pointArray lastObject] addObject:[NSValue valueWithCGPoint:start_location]];

В "touchesMoved" вы должны заменить

[pointArray addObject:[NSValue valueWithCGPoint:current_location]];

со следующим:

[[pointArray lastObject] addObject:[NSValue valueWithCGPoint:current_location]];

В методе "drawRect" цикл 'for' должен выглядеть следующим образом:

for (i=0; i < [pointArray count]; i++)
{
   for (int j=0; j < ([[pointArray objectAtIndex:i] count] -1); j++)
   {
        CGPoint p1 = [[[pointArray objectAtIndex:i] objectAtIndex:j]CGPointValue];
        CGPoint p2 = [[[pointArray objectAtIndex:i] objectAtIndex:j+1]CGPointValue];
        CGContextMoveToPoint(context, p1.x, p1.y);
        CGContextAddLineToPoint(context, p2.x, p2.y);
        CGContextStrokePath(context);
   }
}
...