2014-03-24 5 views
0

CGContext에서 일련의 패스를 블록으로 페인트해야합니다. 이 경로는 사용자가 그려야하므로 방향을 결정할 수 없습니다. 경로는 반대 방향으로 생성된다면CGContextRef 및 짝수 홀수 채우기 규칙

CGContextSaveGState(context); 
UIBezierPath *fillPath = [ UIBezierPath bezierPath ]; 

for (UIBezierPath *path in arrayOfPaths) { 
    [ fillPath appendPath:path ]; 
} 

CGContextAddPath(context, fillPath.CGPath); 
CGContextSetFillColorWithColor(context, [[UIColor GreenColor ] colorWithAlphaComponent:0.3 ].CGColor); 
CGContextFillPath(context); 

그러나 생성 된 도면 짝수 홀수 설정 당량 겹치는 부분이 탈락 된 도면을 생성 같다 : I 경로를 그릴 다음 코드를 사용 규칙을 Yes로 설정하십시오.

제안 사항?

답변

0

각 경로를 채우는 선을 CGContextSaveGState/CGContextRestoreGState 명령으로 둘러 쌀 수 있습니다. 그렇게하면 처음부터 "처음부터"시작할 수 있습니다. 각 채우기에 깨끗한 경로 스택.

편집 : 나는 이것에 대한 좋은 포장 기능을 가지고 :

void CGContextBlock(CGContextRef ctx, void (^block)()) 
{ 
    CGContextSaveGState(ctx); 
    block(); 
    CGContextRestoreGState(ctx); 
} 

그런 식으로 그것을 사용 :

CGContextSetFillColorWithColor(context, [UIColor GreenColor].CGColor); 
for (UIBezierPath *path in arrayOfPaths) 
{ 
    CGContextBlock(context, ^{ 
     CGContextAddPath(context, path.CGPath); 
     CGContextFillPath(context); 
    }); 
} 
+0

나는 블록을 만들기 위해 필요에 따라이 작업을 거라고 생각하지 않습니다 반투명 한 색깔, 나는 나의 초기 질문에서 언급하는 것을 잊었다. 이것은 매번 모양이 이전 그림에 그려지기 때문에 결과적으로 평평한 반투명 한 색을 얻지 못할 것입니다 – reza23