iPhone CGContext: рисование двух линий двух разных цветов

У меня проблемы с использованием CGContext в приложении для iPhone. Я пытаюсь нарисовать несколько линий разными цветами, но все линии всегда имеют цвет, который использовался последним. Я пробовал несколько подходов, но не повезло.

Я создал небольшой примерный проект для решения этой проблемы. Это мой код, который я использую в методе drawRect. Я пытаюсь провести красную и синюю линии:

- (void)drawRect:(CGRect)rect{
    NSLog(@"drawrect!");
    CGContextRef bluecontext = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(bluecontext, 2.0);
    CGContextSetStrokeColorWithColor(bluecontext, [UIColor blueColor].CGColor);
    CGContextMoveToPoint(bluecontext, 1, 1);
    CGContextAddLineToPoint(bluecontext, 100, 100);
    CGContextSetStrokeColorWithColor(bluecontext, [UIColor redColor].CGColor);
    CGContextAddLineToPoint(bluecontext, 200, 100);
    CGContextStrokePath(bluecontext);
}

Спасибо за вашу помощь


person phonecoddy    schedule 15.06.2010    source источник


Ответы (4)


Вставьте этот код непосредственно перед тем, как второй раз установить цвет обводки:

CGContextStrokePath(bluecontext);
CGContextBeginPath(bluecontext);

Все вызовы AddLine и AddOther строят путь. Путь рисуется с помощью вызова типа StrokePath с использованием последних установленных цветов и других атрибутов. Вы пытаетесь нарисовать два отдельных пути, поэтому вы должны вызвать Begin и Stroke для каждого пути. Когда вы начинаете рисовать, Begin как бы подразумевается, хотя не помешает назвать это самим. Базовый процесс рисования:

CGContextBeginPath(bluecontext); // clears any previous path
// add lines, curves, rectangles, etc...
CGContextStrokePath(bluecontext); // renders the path
person drawnonward    schedule 15.06.2010
comment
Спасибо, так что это в основном сводится к тому, что я должен визуализировать путь одним цветом, прежде чем рисовать путь другим цветом? Создание двух контекстов, одного для синих линий и одного для красных, не работает, потому что в конечном итоге они используют один и тот же контекст? - person phonecoddy; 15.06.2010
comment
Да, для каждого изменения цвета вы должны рисовать путь и очищать его. Вы можете делать все это в одном контексте. - person drawnonward; 15.06.2010

Вот что тебе нужно.

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
CGContextSetLineWidth(context, 2.0);

CGContextBeginPath(context);
CGContextSetStrokeColorWithColor(context, [UIColor orangeColor].CGColor);
CGContextMoveToPoint(context, 1, 1);
CGContextAddLineToPoint(context, 100, 100);
CGContextStrokePath(context); // and draw orange line}

CGContextBeginPath(context);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextMoveToPoint(context, 100, 100);
CGContextAddLineToPoint(context, 200, 100);     
CGContextStrokePath(context); // draw blue line
person fyasar    schedule 02.08.2012

Я думаю, это может сработать.

CGContextRef bluecontext = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(bluecontext, 2.0);
CGContextSetStrokeColorWithColor(bluecontext, [UIColor blueColor].CGColor);
CGContextMoveToPoint(bluecontext, 1, 1);
CGContextAddLineToPoint(bluecontext, 100, 100);

CGContextStrokePath(bluecontext); // draw blue line


CGContextSetStrokeColorWithColor(bluecontext, [UIColor redColor].CGColor);
CGContextAddLineToPoint(bluecontext, 200, 100);

CGContextStrokePath(bluecontext); // and draw red line
person Dicarpio    schedule 15.07.2012

Если вас интересует, как это выглядит в цикле:

- (void)drawRect:(CGRect)rect {        
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);

    CGPoint startingPoint = [[pointsArray objectAtIndex:0] CGPointValue];
    CGContextMoveToPoint(context, startingPoint.x, startingPoint.y); //start at this point

    for (int i = 1; i < [pointsArray count]; i++) {
        CGContextBeginPath(context);
        //start at the previous point
        CGContextMoveToPoint(context, 
               [[pointsArray objectAtIndex:i-1] CGPointValue].x, 
               [[pointsArray objectAtIndex:i-1] CGPointValue].y);

        CGPoint point = [[pointsArray objectAtIndex:i] CGPointValue];
        if (point.y < 50) { // if y is less then 50 use red color
            CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
        } else { // else use blue color
            CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

        }
        CGContextAddLineToPoint(context, point.x, point.y); //draw to this point
        CGContextStrokePath(context);
    }
}
person John Riselvato    schedule 22.08.2013
comment
Что означает transformedPoint в вашем ответе? - person Sumeet Mourya; 13.10.2016
comment
Хорошая мысль, забавно, как прошло 3 года, и никто не подумал об этом спросить. Я почти уверен, что вы можете просто использовать точку вместо transformedPoint. Я протестирую это позже сегодня, чтобы проверить. @ Мэди - person John Riselvato; 13.10.2016
comment
Я сделал это вчера, проверяя еще раз код .... но спасибо - person Sumeet Mourya; 14.10.2016
comment
Да, я это исправил. - person Sumeet Mourya; 16.10.2016