2010-06-15 9 views
10

Ich habe einige Probleme mit dem CGContext mit einer iPhone App. Ich versuche, mehrere Linien mit verschiedenen Farben zu zeichnen, aber alle Linien haben immer die Farbe, die zuletzt verwendet wurde. Ich habe mehrere Ansätze ausprobiert, aber ich hatte kein Glück.iPhone CGContext: zwei Linien mit zwei verschiedenen Farben zeichnen

Ich habe ein kleines Beispielprojekt eingerichtet, um dieses Problem zu lösen. Dies ist mein Code, den ich in der drawRect-Methode verwende. Ich versuche, eine rote und eine blaue Linie zu zeichnen:

- (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); 
} 

Dank für Ihre Hilfe nur

Antwort

22

Fügen Sie diesen Code, bevor Sie die Strichfarbe zum zweiten Mal eingestellt:

CGContextStrokePath(bluecontext); 
CGContextBeginPath(bluecontext); 

Alle AddLine- und AddOther-Aufrufe bauen einen Pfad auf. Der Pfad wird mit einem Aufruf wie StrokePath mit den zuletzt festgelegten Farben und anderen Attributen gezeichnet. Sie versuchen, zwei separate Pfade zu zeichnen, daher müssen Sie für jeden Pfad Anfang und Strich aufrufen. Begin ist etwas implizit, wenn Sie mit dem Zeichnen beginnen, obwohl es nicht schadet, es selbst zu nennen. Der grundlegende Ablauf der Zeichnung ist:

CGContextBeginPath(bluecontext); // clears any previous path 
// add lines, curves, rectangles, etc... 
CGContextStrokePath(bluecontext); // renders the path 
+0

Dank, so dass dies läuft im Grunde bis auf die Tatsache, dass ich einen Weg mit einer Farbe zu machen habe, bevor ich einen Weg mit einer anderen Farbe zeichnen? Erstellen von zwei Kontexten, einer für die blauen Linien und einer für die roten Linien, funktioniert nicht, weil sie am Ende den gleichen Kontext verwenden? – phonecoddy

+2

Ja, für jede Farbänderung müssen Sie den Pfad zeichnen und löschen. Sie können alles im selben Kontext tun. – drawnonward

2

Ich denke, das könnte funktionieren.

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 
12

Das ist, was Sie brauchen.

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 
1

Wenn Sie in der Art und Weise interessiert sind, es in einer Schleife aussieht:

- (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); 
    } 
} 
+0

Was ist der transformedPoint in Ihrer Antwort? –

+0

Guter Punkt, lustig, wie 3 Jahre vergangen sind und niemand dachte daran zu fragen. Ich bin mir ziemlich sicher, dass Sie "Punkt" anstelle von "transformedPoint" verwenden können. Ich werde es später testen, um es zu überprüfen. @Mady –

+0

Ich habe dies gestern getan, während ich noch einmal den Code überprüft .... aber danke –