2013-06-07 4 views
6

CALayer 서브 클래스 내에서 드로잉 기능 내부에 호를 그릴 때 문제가 있습니다.시계 방향 대신 시계 반대 방향으로 CGContextAddArc

-(void)drawInContext:(CGContextRef)ctx 
{ 
    CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); 
    CGFloat radius = MIN(center.x, center.y); 

    CGContextBeginPath(ctx); 

    CGContextAddArc(ctx, center.x, center.y, radius, DEG2RAD(0), DEG2RAD(90), YES); 

    CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor); 
    CGContextSetLineWidth(ctx, 5); 

    CGContextDrawPath(ctx, kCGPathStroke); 
} 

아무것도 너무 여기에 획기적인 없지만, 이상한 것은 내가이 시계 방향 갈까요 것을 규정에도 불구하고이 시계 반대 방향으로 호를 그리는 것이다 다음과 같이 그 그리기 기능의 구현이다. 반대로 시계 방향 매개 변수에 NO를 지정하면 호를 시계 방향으로 그립니다. 나는 플립 된 좌표계에 대한 연구를 수행했는데 이것이 문제가 무엇인지 알았지 만, 필자가 말한 것과 반대의 bool 매개 변수를 하드 코딩하고 싶지 않았습니다. 이 문제를 해결하는 방법에 대한 제안 사항이 있으십니까?

감사합니다.

답변

7

실제로 이것은 UIKit 대 Quartz의 뒤집힌 좌표 시스템 때문입니다. docs for CGContext에서 :

시계 방향 매개 변수는 호가 작성된 방향을 결정합니다. 최종 경로의 실제 방향은 그래픽 콘텍스트의 현재 변환 행렬에 의존한다. 예를 들어, iOS에서 UIView는 Y 값을 -1만큼 스케일링하여 Y 좌표를 뒤집습니다. 뒤집힌 좌표계에서 시계 방향 호를 지정하면 변형이 적용된 후 시계 반대 방향 호가됩니다.

당신은 당신의 상황을 뒤집을 변환 행렬을 사용하여 코드에서이 문제를 완화 할 수

:

CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 
당신이 당신의 그림 즉

CGContextSaveGState(ctx); 
CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

// Draw... 

CGContextRestoreGState(ctx); 
를 완료 할 때 당신은 아마 그것을 다시 뒤집어 할

+0

슈퍼 빠른 응답 및 설명 주셔서 감사합니다! 내가 게시 한 코드를 추가하려고 시도했지만 예상대로 시계 방향으로 그리기는하지만 0-90도 범위에서 예상되는 원의 오른쪽 아래 사분면을 그리는 대신 시계 방향으로 0-270도 범위를 그립니다. 어떤 아이디어? –

+0

방금 ​​시도했는데 동쪽 (0도)에서 시계 방향으로 북쪽 (90도)까지 3/4 원을 그립니다. 원의 오른쪽 아래 사분면을 원할 경우 시계 방향으로 0도에서 270도 (남쪽에 위치) 여야합니다. 시계 방향 매개 변수는 각도가 해석되는 방식을 변경하지 않으며 원의 "반"만 그려집니다. –

+0

오 ~ 그래, 왜 그런지 이해할 수있을 것 같아. 플립 변형으로 90도와 270도 위치가 바뀌고 x가 홀로 남았 어. 미안합니다. –

관련 문제