2012-05-16 2 views
1

Я отслеживаю штрихи в своем представлении и создаю соответствующие линии в ассоциированном слое «холст» . точки накапливаются в CGPathRef и сохраняются в NSArray при касанииDidEnd времени.Как рисовать линии в кварцевом контексте, которые не связаны между собой?

в drawLayer время я рисую как путь тока и сохраненные пути следующим образом:

// draw the current line: 
    CGContextAddPath(ctx, path); 
    CGContextStrokePath(ctx); 
    NSLog(@"Canvas drawing path %@", path); 

    // draw the stored lines 
    for (NSMutableArray *arr in storedPaths) { 
     CGMutablePathRef aPath = CGPathCreateMutable(); 
     // set up the path with the CGPointObjects 
     NSLog(@"Canvas drawing stored path"); 
     BOOL inited = NO; 
     for (CGPointObject *thePt in arr) {      
      if (inited==NO) { 
       CGPathMoveToPoint(aPath, NULL, [thePt.x floatValue], [thePt.y floatValue]); 
       //CGContextMoveToPoint(ctx, [thePt.x floatValue], [thePt.y floatValue]); 
       inited = YES; 
      } 
      else { 
       CGPathAddLineToPoint(aPath, NULL, [thePt.x floatValue], [thePt.y floatValue]); 
       //CGContextAddLineToPoint(ctx, [thePt.x floatValue], [thePt.y floatValue]); 
      } 
     } 
     CGContextAddPath(ctx, aPath); 
     CGContextStrokePath(ctx); 
     // didn't help connected problem 
     //CGPathRelease(aPath); 
    } 

Это работает, как ожидалось, кроме него соединяет конечную точку первой линии к начальной точке следующей строке, вместо оставляя их как бессвязные отдельные линии. Пример: пользователь рисует X, но получает X с двумя связанными конечными точками.

CGClosePath не похож на то, что я хочу. Любые предложения будут высоко ценится.

ответ

0

Если каждая четная/нечетная пара является строкой, замените «inited == NO» на счетчик и используйте «counter% 2 == 0», чтобы для четных точек он перемещался туда, где вы хотите быть, и для нечетных нумерованных точек он соединяет предыдущую точку. Может быть, проще не использовать быстрое перечисление, а вместо него старомодно для цикла. документы

for (int i = 0; i < [arr count]; ++i) { 
     CGPointObject *thePt = [arr objectAtIndex:i];      
     if (i%2 == 0) 
      CGPathMoveToPoint(aPath, NULL, [thePt.x floatValue], [thePt.y floatValue]); 
     else 
      CGPathAddLineToPoint(aPath, NULL, [thePt.x floatValue], [thePt.y floatValue]); 
    } 
0

яблока на CGContextAddPath() удивительно неадекватные, но, похоже, он продолжает предыдущий путь, а не добавление нового подконтура. поэтому попробуйте создать один CGMutablePathRef, заполнив его субпатами, а затем добавив все это в контекст и погладив его.

т. Е. Переместите вызов CGPathCreateMutable() до внешнего цикла и переместите вызовы на CGContextAddPath() и CGContextStrokePath() после него. остальные могут оставаться неизменными.

Смежные вопросы