2013-06-07 45 views
6

Tôi gặp sự cố khi vẽ một cung bên trong hàm vẽ của tôi bên trong lớp con CALayer. Việc thực hiện cho rằng chức năng vẽ là như sau:CGContextAddArc ngược chiều kim đồng hồ thay vì theo chiều kim đồng hồ

-(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); 
} 

Không có gì quá đột phá ở đây, nhưng điều kỳ lạ là nó vẽ arc ngược mặc dù tôi đã xác định rằng nó shoud được chiều kim đồng hồ. Ngược lại, khi tôi chỉ định NO cho tham số chiều kim đồng hồ, nó vẽ vòng cung theo chiều kim đồng hồ. Tôi đã thực hiện một số nghiên cứu về các hệ tọa độ lộn xộn và tìm ra rằng đây có thể là vấn đề ở đây, nhưng tôi không muốn chỉ mã hóa tham số bool đối diện với ý tôi. Bất kỳ đề xuất về làm thế nào để sửa lỗi này?

Cảm ơn!

Trả lời

7

Điều này thực sự là do hệ tọa độ lật của UIKit so với Quartz. Từ số docs for CGContext:

Tham số chiều kim đồng hồ xác định hướng mà vòng cung được tạo; hướng thực sự của con đường cuối cùng phụ thuộc vào ma trận chuyển đổi hiện tại của ngữ cảnh đồ họa. Ví dụ, trên iOS, một UIView lật Y-phối hợp bằng cách nhân rộng các giá trị Y bằng -1. Trong một hệ tọa độ lật, xác định một kết quả hồ quang theo chiều kim đồng hồ trong một vòng cung ngược chiều kim đồng hồ sau khi phép biến đổi được áp dụng.

Bạn có thể làm giảm bớt này trong mã của bạn bằng cách sử dụng các ma trận biến đổi để lật ngữ cảnh của bạn:

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

Bạn có thể muốn lật nó trở lại khi bạn đã kết thúc với bản vẽ của bạn tức là

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

// Draw... 

CGContextRestoreGState(ctx); 
+0

Cảm ơn bạn đã phản hồi và giải thích siêu nhanh! Tôi đã thử thêm mã mà bạn đã đăng và hiện đang vẽ theo chiều kim đồng hồ như mong đợi nhưng thay vì vẽ một góc phần tư (góc phần tư bên phải thấp hơn của vòng tròn như mong đợi trong khoảng 0-90 độ), nó vẽ khoảng 0-270 theo chiều kim đồng hồ. Bất kỳ ý tưởng tại sao? –

+0

Tôi vừa thử điều này, và nó vẽ 3/4 vòng tròn từ phía đông (0 độ) theo chiều kim đồng hồ đến phía bắc (90 độ). Nếu bạn muốn góc phần tư dưới bên phải của hình tròn, nó phải từ 0 độ đến 270 độ (do nam) theo chiều kim đồng hồ. Tham số chiều kim đồng hồ không thay đổi cách các góc được diễn giải, chỉ có "một nửa" của vòng tròn được vẽ. –

+0

Oh okay Tôi nghĩ rằng tôi hiểu tại sao đó là ... bằng cách lật chuyển đổi các vị trí 90 và 270 độ được đổi chỗ và x được trái một mình. Xin lỗi vì điều đó. –

Các vấn đề liên quan