iPhone - копирование UIBezierPath в CGPath и рендеринг в качестве оригинала - PullRequest
5 голосов
/ 11 июня 2011

Я создал сложный UIBezierPath, который состоит из нескольких сегментов пути, сплошных, пунктирных, линий, цветов, дуг и т. Д. Итак, у меня есть это, и теперь я хочу отрендерить его в CGContext.

Итак, я конвертирую его в CGPathReference, используя

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath);

Проблема заключается в следующем: теоретически, если я хочу нарисовать путь в CGContext, я должен определить ширину обводки, цвет, стиль линии,режим смешивания и т. д. для каждого сегмента, который должен быть различным, но созданный мною UIBezierPath содержит всю эту информацию.

Итак, мне интересно, есть ли способ просто "пометить" CGPath какэто на CGContext, так что на нем будет проставлена ​​вся оригинальная информация?

спасибо.

1 Ответ

6 голосов
/ 11 июня 2011

DR, вы правы: это очень запутанно!

Но я думаю, что Том прав, просто используйте [aBezierPath stroke].

Итак, это будет что-то вроде этого:

REF - это созданный вами (CGContextRef).

YOURBEZIERPATH - это (UIBezierPath *).

НеизбежноВы должны разобраться с проблемой «рисования вверх ногами», так что:

UIGraphicsPushContext(REF);
CGContextSaveGState(REF);
CGContextTranslateCTM(REF, 0, the height*);
CGContextScaleCTM(REF, 1.0, -1.0);
[YOURBEZIERPATH stroke];
CGContextRestoreGState(REF);
UIGraphicsPopContext();

Вот и все.

Re Ваш комментарий ниже : У меня естьмассив UIBezierPaths.У каждого Безье свой стиль и цвет.

Помогает ли это?... Замените один вызов "stroke" на цикл for:

UIGraphicsPushContext(REF);
CGContextSaveGState(REF);
CGContextTranslateCTM(REF, 0, the height*);
CGContextScaleCTM(REF, 1.0, -1.0);

for each of YOURBEZIERPATH in your array...
    {
    CGContextSaveGState(REF);
    [YOURBEZIERPATH stroke];
    CGContextRestoreGState(REF);
    }

CGContextRestoreGState(REF);
UIGraphicsPopContext();

Вам на самом деле не нужно беспокоиться об использовании aBezierPath.CGPath или его копии.

Сновавы правы, это очень сбивает с толку, два мира UI и CG !!


* высота: часто что-то вроде self.frame.size.height.Я просто включил это для тех, кто ищет общий пример кода в будущем.

...