2013-04-24 36 views
20

Tôi đang tạo một CAShapeLayer để sử dụng làm mặt nạ cho lớp của UIView. Tôi đang sử dụng UIBezierPath để vẽ lớp hình dạng. Nó hoạt động tốt, ngoại trừ tôi nhận được một số kết quả kỳ lạ khi tôi vẽ. Hình học không hoạt động như mong đợi. Tôi đang cố gắng vẽ "lát bánh" đơn giản ở góc trên bên phải:Tại sao cho addArcWithCenter một startAngle của 0 độ làm cho nó bắt đầu ở 90 độ?

#define degreesToRadians(x) ((x) * M_PI/180.0) 

... 

// "layer" refer's to the UIView's root layer 

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 

maskLayer.frame = 
    layer.presentationLayer ? 
    ((CAGradientLayer *)layer.presentationLayer).bounds : layer.bounds; 
maskLayer.fillRule = kCAFillRuleEvenOdd; 
maskLayer.needsDisplayOnBoundsChange = YES; 

CGFloat maskLayerWidth = maskLayer.bounds.size.width; 
CGFloat maskLayerHeight = maskLayer.bounds.size.height; 
CGPoint maskLayerCenter = 
    CGPointMake(maskLayerWidth/2,maskLayerHeight/2); 

UIBezierPath *path = [UIBezierPath bezierPath]; 

[path moveToPoint:maskLayerCenter]; 

[path addArcWithCenter:maskLayerCenter radius:(maskLayerWidth/2) 
startAngle:degreesToRadians(0) endAngle:degreesToRadians(90) clockwise:YES]; 

[path closePath]; 


maskLayer.path = path.CGPath; 

layer.mask = maskLayer; 

Kết quả cuối cùng là lát bánh được vẽ ở góc dưới bên phải. Điểm đầu tiên của vòng cung được vẽ ở 90 độ, sau đó xuống đến 180. Tại sao nó làm điều này mặc dù tôi đang sử dụng góc 0 và 90 độ?

Trả lời

67

Hình ảnh này xuất phát trực tiếp từ the documentation.

image

Và có một cuộc thảo luận về cách thức hoạt động (cho hệ tọa độ mặc định)

Thảo luận
phương pháp này thêm arc quy định bắt đầu tại thời điểm hiện tại. Các vòng cung tạo ra nằm trên chu vi của vòng tròn quy định. Khi được vẽ trong hệ tọa độ mặc định, góc bắt đầu và kết thúc dựa trên vòng tròn đơn vị được hiển thị trong Hình 1. Ví dụ, chỉ định một góc bắt đầu là 0 radian, một góc kết thúc của π radian, và thiết lập tham số chiều kim đồng hồ là YES vẽ nửa dưới của vòng tròn. Tuy nhiên, chỉ định cùng một góc bắt đầu và kết thúc nhưng đặt tham số clockwise được đặt thành NO vẽ nửa trên của vòng tròn.

Đây là cách các góc hoạt động cho addArcWithCenter:radius:startAngle:endAngle:clockwise:. Nếu đó không phải là những gì bạn đang nhìn thấy sau đó bạn đang tính toán góc của bạn không chính xác.

9

Có một cái nhìn tại Hình 1 trong tài liệu bezierPathWithArcCenter:radius:startAngle:endAngle:clockwise:: Đối với một "chiếc bánh lát" ở phía trên bên phải góc bạn phải sử dụng các thông số

startAngle:degreesToRadians(-90) endAngle:0 clockwise:YES 

(Lý do là mặc định phối hợp hệ thống trên iOS có trục x trỏ sang phải và trục y trỏ xuống.)