2013-05-09 12 views
7

Mam problem z rysowaniem linii, które są pogłaskane kolorem, a następnie wypełniają wnętrze (tworzą wielokąt) innym.Rysowanie wieloboku za pomocą jednego koloru dla obrysu i innego dla wypełnienia?

UIColor *houseBorderColor = [UIColor colorWithRed:(170/255.0) green:(138/255.0) blue:(99/255.0) alpha:1]; 
CGContextSetStrokeColorWithColor(context, houseBorderColor.CGColor); 
CGContextSetLineWidth(context, 3); 

// Draw the polygon 
CGContextMoveToPoint(context, 20, viewHeight-19.5); 
CGContextAddLineToPoint(context, 200, viewHeight-19.5); // base 
CGContextAddLineToPoint(context, 300, viewHeight-119.5); // right border 
CGContextAddLineToPoint(context, 120, viewHeight-119.5); 
CGContextAddLineToPoint(context, 20, viewHeight-19.5); 

// Fill it 
CGContextSetRGBFillColor(context, (248/255.0), (222/255.0), (173/255.0), 1); 
//CGContextFillPath(context); 

// Stroke it 
CGContextStrokePath(context); 

Z CGContextStrokePath zakomentowanym, otrzymuję ten wynik:

enter image description here

Ale gdybym odkomentowaniu CGContextStrokePath i wypełnić wielokąt, kolor przelewa uderzeń:

enter image description here

Jak osiągnąć taki wynik (bez konieczności ponownej redakcji Procedura ole rysunek dwukrotnie):

enter image description here

Odpowiedz

16

Można użyć

CGContextDrawPath(context, kCGPathFillStroke); 

zamiast

CGContextFillPath(context); 
CGContextStrokePath(context); 

Problem polega na tym, że zarówno CGContextFillPath() i CGContextStrokePath(context) jasnego obecna ścieżka, tak, że tylko pierwsza operacja się powiedzie, a druga operacja niczego nie rysuje. CGContextDrawPath() łączy wypełnienie i obrys bez czyszczenie ścieżki pomiędzy.

+0

Nie chcę brzmieć wymagająco, ale czy mógłbyś opracować kompletną odpowiedź, ponieważ nie wiem, dokąd powinieneś podążać 'CGContextDrawPath()'? –

+3

Niestety, odpowiedź była krótka, ponieważ rozmawiam przez telefon :-) To połączenie zastępuje CGContextFillPath i ... StrokePath. –

+0

To najlepsze rozwiązanie w tym przypadku. – alastair

2

Gdy udar mózgu lub wypełnić ścieżkę w kontekście kontekst usuwa ścieżkę dla Ciebie (nie spodziewa się, że jego praca jest wykonywana). Musisz ponownie dodać ścieżkę, jeśli chcesz ją wypełnić po jej przyciśnięciu.

Prawdopodobnie najlepiej jest utworzyć lokalną zmienną CGPathRef path, zbudować ścieżkę, dodać ją, obrysować, dodać ponownie, wypełnić.

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, nil, 20, viewHeight-19.5); 
CGPathAddLineToPoint(path nil, 200, viewHeight-19.5); // base 
CGPathAddLineToPoint(path nil, 300, viewHeight-119.5); // right border 
CGPathAddLineToPoint(path nil, 120, viewHeight-119.5); 
CGPathAddLineToPoint(path nil, 20, viewHeight-19.5); 

CGContextAddPath(context, path); 
CGContextFillPath(context); 

// possibly modify the path here if you need to 

CGContextAddPath(context, path); 
CGContextStrokePath(context); 
+0

Mógłbyś rozwinąć na 'path' tworzenia przy użyciu kodu I dostarczone? –

+1

Zamiast tego [CGContext] używałeś [CGPath API] (https://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html) (https: // developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGContext/Reference/reference.html), aby utworzyć ścieżkę. Jednak w tym przypadku powinieneś prawdopodobnie użyć 'CGContextDrawPath()', ponieważ problem, który masz, polega na tym, że ścieżka jest usuwana z kontekstu przez 'CGContextFillPath()' (i tak głaskasz pustą ścieżkę, dlatego nic się nie dzieje). – alastair

+0

Naprawdę doceniam, że poświęciłeś czas na wyjaśnienie tej koncepcji, dzięki czemu wszystko jest o wiele jaśniejsze w odniesieniu do CGContext! Dzięki! –

5

Korzystanie UIBezierPath można to zrobić:

UIBezierPath *path = [[UIBezierPath alloc] init]; 
[path moveToPoint:CGPointMake(20, viewHeight-19.5)]; 
[path addLineToPoint:CGPointMake(200, viewHeight-19.5)]; 
[path addLineToPoint:CGPointMake(300, viewHeight-119.5)]; 
[path addLineToPoint:CGPointMake(120, viewHeight-119.5)]; 
[path addLineToPoint:CGPointMake(20, viewHeight-19.5)]; 

[[UIColor colorWithRed:(248/255.0) green:(222/255.0) blue:(173/255.0) alpha:1.0] setFill]; 
[path fill]; 
[[UIColor colorWithRed:(170/255.0) green:(138/255.0) blue:(99/255.0) alpha:1.0] setStroke]; 
[path stroke]; 
+0

Wiem o UIBezierPath tylko z przykładów Jabłka, czy ma jakieś zalety w przeciwieństwie do metody 'CGContext' umieszczonej w moim pytaniu? @MikePollard –

+2

Myślę, że wszystkie zwykłe zalety korzystania z obiektów NSObjects, a nie Core Core. –

Powiązane problemy