2013-02-15 28 views
5

Moja próba narysowania linii UIBezierPath w różnych kolorach zawodzi mnie. Wszystkie linie zmieniają się na aktualnie wybrany kolor. Cała moja ścieżka i informacje są przechowywane w obiekcie NSMutableArray o nazwie pathInfo. W informacjach o ścieżce upuszczam tablicę zawierającą ścieżkę, kolor, szerokość i typ linii. Działa to dobrze, z wyjątkiem tego, że wszystkie linie zmieniają się w kolory wybrane przez użytkownika. Byłbym wdzięczny za każdą pomoc!Kolory wielu linii UIBezierPath

- (void)drawRect:(CGRect)rect { 
    UIBezierPath *drawPath = [UIBezierPath bezierPath]; 
    drawPath.lineCapStyle = kCGLineCapRound; 
    drawPath.miterLimit = 0; 

    for (int i = 0; i < [pathInfo count]; i++){ 
     NSArray *row = [[NSArray alloc] initWithArray:[pathInfo objectAtIndex:i]]; 
     NSLog(@"Path: %@",[row objectAtIndex:0]); 
     NSLog(@"Color: %@",[row objectAtIndex:1]); 
     NSLog(@"Width: %@",[row objectAtIndex:2]); 
     NSLog(@"Type: %@",[row objectAtIndex:3]); 

     //width 
     drawPath.lineWidth = [[row objectAtIndex:2] floatValue]; 

     //color 
     [[row objectAtIndex:1] setStroke]; 

     //path 
     [drawPath appendPath:[row objectAtIndex:0]]; 

    } 

    UIBezierPath *path = [self pathForCurrentLine]; 
    if (path) 
    [drawPath appendPath:path]; 

    [drawPath stroke]; 
} 

- (UIBezierPath*)pathForCurrentLine { 
    if (CGPointEqualToPoint(startPoint, CGPointZero) && CGPointEqualToPoint(endPoint, CGPointZero)){ 
     return nil; 
    } 

    UIBezierPath *path = [UIBezierPath bezierPath]; 
    [path moveToPoint:startPoint]; 
    [path addLineToPoint:endPoint]; 

    return path; 

} 
+0

Proszę przekazać mi swój pełny kod dla tego, jeśli to możliwe. W rzeczywistości mam ten sam problem. Ale używam metody touchesBegan, touchesMoved i touchesEnd. Nie mogę tego zrobić. – Abha

Odpowiedz

3

Kolory obrysu/wypełnienia mają wpływ tylko na polecenie -stroke. Nie mają one wpływu na polecenie -appendPath:. Ścieżki nie zawierają informacji o kolorze w segmencie.

Jeśli potrzebujesz wielobarwnej linii, będziesz musiał suszyć każdy kolor oddzielnie.

+0

A jak to zrobić @ Kevin-Ballard – JasonBourne

+0

@JasonBourne: Zamiast dołączania wszystkich ścieżek do jednej ścieżki głównej, po prostu obrysuj każdą ścieżkę po kolei. –

+0

Czy to nie jest to, co robię? Każda z nich zostanie narysowana w wyciągu na wyciągu @ kevin-ballard – JasonBourne

2

Ustaw kolor obrysu (i co ty), a następnie stroke, a następnie przejść do następnej ścieżki:

- (void)drawRect:(CGRect)rect 
{ 
    for (int i = 0; i < [pathInfo count]; i++){ 
     NSArray *row = [[NSArray alloc] initWithArray:[pathInfo objectAtIndex:i]]; 

     NSLog(@"Path: %@",[row objectAtIndex:0]); 
     NSLog(@"Color: %@",[row objectAtIndex:1]); 
     NSLog(@"Width: %@",[row objectAtIndex:2]); 
     NSLog(@"Type: %@",[row objectAtIndex:3]); 

     UIBezierPath *path = [row objectAtIndex:0]; 

     path.lineCapStyle = kCGLineCapRound; 
     path.miterLimit = 0; 

     //width 
     path.lineWidth = [[row objectAtIndex:2] floatValue]; 

     //color 
     [[row objectAtIndex:1] setStroke]; 

     //path 
     [path stroke]; 
    } 

    UIBezierPath *path = [self pathForCurrentLine]; 
    if (path) 
    { 
     // set the width, color, etc, too, if you want 
     [path stroke]; 
    } 
} 
+1

Wow twoja odpowiedź jest również ważna! Doceniam twoją pomoc, Rob! Ta metoda wydaje się działać lepiej. – JasonBourne