iPhone - копирование UIBezierPath в CGPath и рендеринг как оригинал

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

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

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath);

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

Итак, мне интересно, есть ли способ просто «проштамповать» CGPath так, как он есть в CGContext, чтобы на нем была отмечена вся исходная информация?

благодаря.


person Duck    schedule 11.06.2011    source источник
comment
Разве нельзя просто использовать метод stroke UIBezierPath?   -  person Tom Irving    schedule 11.06.2011


Ответы (1)


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

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

Итак, это будет примерно так:

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

YOURBEZIERPATH - это (UIBezierPath *).

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

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

Ну это все.

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

Это помогает? ... Замените один "штриховой" вызов циклом 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 или его копии.

Опять же, вы правы, это очень сбивает с толку, два мира пользовательского интерфейса и компьютерной графики !!


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

person Fattie    schedule 11.06.2011
comment
Спасибо, у меня это почти работает. Моя единственная проблема заключается в следующем: у меня есть массив UIBezierPaths, который мне нужно нарисовать в контексте. У каждого безье свой стиль и цвет. Когда я использую ваш метод для обводки контуров в цикле, каждый раз, когда вызывается ваш метод, все контуры, включая ранее обведенные, меняются на последний указанный стиль. Например: у меня есть 3 пути: пунктирный / синий, сплошной / красный, сплошной / зеленый. После первого запуска у меня есть пунктирная / синяя дорожка. После второго прогона у меня есть два сплошных / красных пути, а после третьего прогона все пути меняются на сплошные / зеленые. - person Duck; 11.06.2011
comment
Спасибо, Джо, я ошибся в нескольких концепциях, но теперь это работает как по волшебству. Спасибо!!! - person Duck; 13.06.2011
comment
Нет, я сделал обратное, я рисую все пути каждый раз, когда мне нужно что-то обновить. Рисование всех путей не так медленно, как я думал, значит, работает очень хорошо. - person Duck; 13.06.2011