Как нарисовать двойную пунктирную линию в кварце - PullRequest
0 голосов
/ 02 августа 2011

Я пытаюсь создать приложение, которое позволяет пользователю рисовать пунктирную линию пальцем на iPad. У меня есть все процедуры рисования для создания отдельных линий. Мой вопрос заключается в том, как я должен рисовать двойную линию таким образом, чтобы она не перекрывала себя при создании кривых. Я пытался сделать это, добавив в мой путь вторую строку со смещением x и y текущей точки. Это прекрасно работает, пока вы двигаетесь вертикально или горизонтально. Когда вы рисуете под углом, двойные линии становятся одной линией.

Я храню массив точек, сохраненных как NSValues ​​(pathPoints), чтобы я мог сохранить их для дальнейшего использования. Начальная точка - это первая точка в pathPoints.

    UIGraphicsBeginImageContext(self.frame.size);

    //This needs to be a dotted line
    CGFloat pattern[] = {10,20};
    CGContextSetLineDash(UIGraphicsGetCurrentContext(), 3, pattern, 2);


    CGMutablePathRef path = CGPathCreateMutable();
    CGMutablePathRef path2 = CGPathCreateMutable();


    CGPoint startingPoint = [[pathPoints objectAtIndex:0] CGPointValue];

    CGPathMoveToPoint(path, nil, startingPoint.x, startingPoint.y);
    CGPathMoveToPoint(path2, nil, startingPoint.x + 10, startingPoint.y + 10);

     for (int i = 1; i < [pathPoints count]; i++)
    {
        CGPoint linePoint = [[pathPoints objectAtIndex:i] CGPointValue];
        CGPathAddLineToPoint(path, nil, linePoint.x, linePoint.y);
        CGPathAddLineToPoint(path2, nil, linePoint.x + 10, linePoint.y + 10);

     }

// конечно позже я добавляю пути к контексту и обводю их.

        CGContextAddPath(UIGraphicsGetCurrentContext(), path);
        CGContextAddPath(UIGraphicsGetCurrentContext(), path2);

        CGContextStrokePath(UIGraphicsGetCurrentContext());

        UIGraphicsEndImageContext();

Я очень ценю любую помощь, которую я могу получить с этим.

1 Ответ

2 голосов
/ 02 августа 2011

Если у вас все в порядке с соединяемыми линиями в конце (см. Изображение ниже), вы можете создать эффект, используя CGContextReplacePathWithStrokedPath().

/**
 * CGContextRef context = <the context you're drawing to>
 * CGFloat lineWidth = <the width of each of your two lines>
 * CGFloat lineSpace = <the space between the two lines>
 **/

// Create your path here (same as you would for a single line)

CGContextSetLineWidth(context, lineWidth + lineSpace);
CGContextReplacePathWithStrokedPath(context);
CGContextSetLineWidth(context, lineWidth);
CGContextStrokePath(context);

Stroked Path

...