2009-05-02 5 views
5

Я пытаюсь нарисовать несколько строк с помощью iPhone/Touch SDK. Я хотел бы иметь возможность изменять цвет линий, но вызов CGContextSetRGBStrokeColor, похоже, не влияет на рисованные линии, созданные с помощью CGContextAddLineToPoint, до тех пор, пока не будет выполнен фактический вызов CGContextStrokePath. Поэтому, если я делаю несколько вызовов, чтобы изменить цвет, только тот, который был сделан непосредственно перед CGContextStrokePath, имеет какой-либо эффект. Вот что я имею в виду:Изменение цвета с помощью CGContextStrokePath

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,0,1,1); 
    CGContextStrokePath(ctx); 
} 

Я предполагаю, что я делаю что-то пойдет неправильно, то я просто не могу вполне понять, что. Я думал, что если бы я добавил вызовы CGContextStrokePath, это помогло бы, это не так.

См обсуждение ниже для того, как я добрался до исправленного кода:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    CGContextStrokePath(ctx); 
    CGContextClosePath(ctx); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 100, 100); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    CGContextStrokePath(ctx); 
} 

ответ

4

Я не думаю, что вы делаете что-то неправильно ужасно, просто CGContextStrokePath для данного графического контекста может иметь только один RGBStrokeColor на время. В результате требуется несколько вызовов CGContextStrokePath один раз для каждого цвета.

Ссылка на копию (а не копию) в графический контекст добавляется в этот стек операций рисования при каждом вызове CGContextAddLineToPoint(). Когда вы наконец вызываете CGContextStrokePath(), используется последнее значение для RGBStrokeColor.

Если вы хотите использовать несколько цветов с одним и тем же графическим контуром, то вам кажется, что вам нужно сделать несколько вызовов CGContextStrokePath(), изменяя значение RGBStrokeColor() в графическом контексте между вызовами. Пример кода Apple в AccelerometerGraph/GraphView.m также указывает на это.

+0

Хм. Это тоже я пришел к выводу, но когда я запускаю код выше в симуляторе с линиями CGContextStrokePath (ctx), которые не закомментированы, я получаю первую строку, нарисованную красным цветом, а затем ничего. То, что мне кажется, это должно сделать, это нарисовать первую строку красным цветом, а затем нарисовать вторую в зеленом цвете, но если я запустил ее в симуляторе iPhone, это не так. – stinkymatt

+0

Возможно, текущий путь (включая начальную точку) стирается при первом вызове? Согласно документам Apple - «Quartz использует ширину линии и цвет штриха графического состояния для рисования пути. В качестве побочного эффекта при вызове этой функции Quartz очищает текущий путь». –

+0

Во-первых, я рекомендую вам использовать слово «стертое». Это один из моих любимых. Во-вторых, я благодарю вас за то, что помогли мне увидеть документы по-другому. Что нужно сделать, так это вызвать CGContextBeginPath (ctx). Затем измените цвет хода, переместите начальную точку и добавьте линию, затем выполните штрих и закройте путь. Повторите для последующих сегментов линии. Я попытаюсь добавить исправленный код к моему оригинальному сообщению для потомков. Благодаря! – stinkymatt

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