2013-08-14 4 views
0

코어 그래픽을 사용하여 두 개의 동심원을 그리려합니다. 다음 코드는 파란색 원과 작은 흰색 원을 그릴 것이라고 기대하지만 파란색 원을 그립니다. 내가 뭘 놓치고 있니?코어 그래픽을 사용하여 다중 호 그리기

CGContextRef c = UIGraphicsGetCurrentContext(); 

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 100, 0, M_PI * 2, true); 
CGContextSetFillColor(c, CGColorGetComponents([[UIColor blueColor] CGColor])); 
CGContextFillPath(c); 

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 90, 0, M_PI * 2, true); 
CGContextSetFillColor(c, CGColorGetComponents([[UIColor whiteColor] CGColor])); 
CGContextFillPath(c); 

답변

2

불필요하게 간접적 인 방식으로 채우기 색을 설정하고 있습니다. 대신이 작업을 수행 : 더 나은,

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 100, 0, M_PI * 2, true); 
CGContextSetFillColorWithColor(c, [[UIColor blueColor] CGColor]); 
CGContextFillPath(c); 

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 90, 0, M_PI * 2, true); 
CGContextSetFillColorWithColor(c, [[UIColor whiteColor] CGColor]); 
CGContextFillPath(c); 

을 또는 다만 직접 UIKit의 그리기 방법을 사용하십시오

[[UIColor blueColor] setFill]; 
[[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES] fill]; 

[[UIColor whiteColor] setFill]; 
[[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:90 startAngle:0 endAngle:M_PI * 2 clockwise:YES] fill]; 

당신의 코드는 두 가지가있는 "회색"색 공간에 [[UIColor whiteColor] CGColor] 때문에 반환 색을 실패 구성 요소, "회색"값 (검정의 경우 0, 흰색의 경우 1) 및 알파 값이 포함됩니다. 이 경우 문맥은 RGBA이므로 CGContextSetFillColor은 4 개의 구성 요소를, RGB는 3 개, 알파는 1 개를 볼 것으로 예상합니다.

The documentation for CGContextSetFillColor는 지적 : 선호하는 API가 사용하는 것을

참고 지금 CGContextSetFillColorWithColor입니다.

+0

"컨텍스트는 RGBA입니다."약간 오해의 소지가 있습니다. 컨텍스트가 배경색을 위해 어떤 색 공간을 사용 하느냐가 중요하지 않지만 색 공간을 채우는 것은 중요합니다. (http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGContext/Reference/ reference.html # // apple_ref/c/func/CGContextSetFillColorSpace)입니다. 기본값은 언급되지 않았습니다. 새로운 문맥을 위해서는 아마도 RGB 나 맥락의 배경 색상 공간 (대개 RGB)이지만,'SetFillColorWithColor','SetRGBFillColor' 등으로 채우기 색상을 설정하면 채우기 색상 공간이 부작용으로 설정됩니다 . –

+0

... 예를 들어'SetFillColorWithColor'를 흰색으로 설정하면 채우기 색상 공간은 흰색 색상 공간이되고 'SetFillColor'는 컨텍스트의 배경색이 RGB 인 경우에도 하나 또는 두 개의 구성 요소 만 필요합니다. –

+0

@PeterHosey : 당연히 iOS 또는 Mac 앱에서 가장 일반적인 경우를 너무 단순화했습니다. CG로 수년간 작업하면서, 채색 공간에 대해 걱정해야한다고 말할 수는 없습니다. 어쩌면 나는 단지 운이 좋았을 것입니다. –

관련 문제