Основная графика нарисовать линию с контуром - PullRequest
1 голос
/ 22 января 2012

Я рисую произвольную линию с Core Graphics шириной 4 пикселя, теперь я хотел бы, чтобы эта линия имела контур в 1 пиксель другого цвета.Я не вижу никаких функций компьютерной графики, которые бы достигли этого "из коробки", но я ищу предложения о том, как это можно сделать.Это мой существующий код:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 4.0);

CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPointValue];
CGContextMoveToPoint(context, curPoint.x, curPoint.y);

for( int i = 1; i < [points count]; i++ ) {
    curPoint = [(NSValue*)[points objectAtIndex:i] CGPointValue];
    CGContextAddLineToPoint(context, curPoint.x, curPoint.y);
    CGContextStrokePath(context);
    CGContextMoveToPoint(context, curPoint.x, curPoint.y);
}

Это производит единственную строку.Я хотел бы получить линию 4px с линией 1px, выделяющей линию 4px, вот так:

http://img692.imageshack.us/img692/6196/lineexample.png

Ответы [ 5 ]

5 голосов
/ 22 января 2012

В iOS 5.0 добавлена ​​новая функция CGPathCreateCopyByStrokingPath(), которая делает то, что вы хотите.

Сначала создайте CGPathRef для черного пути, а затем создайте его копию с помощью CGPathCreateCopyByStrokingPath().

Это даст вам новый путь, который вы можете заполнить черным и обвести красным, чтобы получить то, что вы хотите.

Кроме того, создание путей немного медленное. Вы должны избегать создания контуров при выполнении рисования экрана. Все ваши пути должны быть сохранены в оперативной памяти и готовы к работе до того, как вы начнете рисовать на экране. drawRect: должен только рисовать путь, а не создавать его.

1 голос
/ 08 февраля 2012

Аналогично тому, что предлагает Абхи Беккерт, но вы можете использовать эту функцию:

CGContextReplacePathWithStrokedPath(CGContextRef c);

Что присутствует и в старых SDK - например, iOS 4.1, MacOS X 10.6.
Также лучше создать весь путь и затем обвести его (или обвести и заполнить в одно и то же время) в конце - другими словами, нет необходимости иметь CGContextStrokePath внутри цикла.

0 голосов
/ 23 января 2012

Чтобы добавить ответ на мой собственный вопрос, это можно сделать, нарисовав линию на несколько пикселей шире в выделенном цвете, за которой следует фактическая линия сверху.Это создает эффект контура.

0 голосов
/ 22 января 2012

Не существует встроенного способа преобразования обводки в путь, а затем обводки этого пути. Тем не менее, вы можете приблизиться к этому, нарисовав линию дважды: один раз с 6 пиксельными штрихами (4 пикселя + 1 с каждой стороны), а затем снова с 4 пиксельными штрихами другого цвета

Аналогично:

CGContextRef context = UIGraphicsGetCurrentContext();

CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPointValue];
CGContextMoveToPoint(context, curPoint.x, curPoint.y);

for( int i = 1; i < [points count]; i++ ) {
    curPoint = [(NSValue*)[points objectAtIndex:i] CGPointValue];
    CGContextAddLineToPoint(context, curPoint.x, curPoint.y);
}

// Set your 1 pixel highlight color here using CGContextSetRGBStrokeColor or equivalent
// CGContextSetRGBStrokeColor(...)
CGContextSetLineWidth(context, 6.0);
CGContextStrokePath(context);


// Set your 4 pixel stroke color here using CGContextSetRGBStrokeColor or equivalent
// CGContextSetRGBStrokeColor(...)
CGContextSetLineWidth(context, 4.0);
CGContextStrokePath(context);

Другой идеей было бы настроить тень с помощью CGContextSetShadowWithColor (context, CGSizeZero, 1.0, yourHighlightColorHere) до рисования обводки, хотя это не будет рисовать цвет выделения с полной непрозрачностью. (Я также не могу вспомнить, если теневые свойства имеют штрихи - я использовал их только с заливками)

0 голосов
/ 22 января 2012

Боюсь, вам придется снова нарисовать траекторию с шириной линии, равной 1. Если вы хотите, чтобы она находилась за пределами вашего 4-пиксельного пути, вам придется соответствующим образом скорректировать траекторию.

Редактировать: на ум приходит еще один вариант - вы можете погладить шаблон - пример использования см. В Apple QuartzDemo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...