2013-04-24 1 views
20

Я создаю CAShapeLayer для использования в качестве маски для слоя UIView. Я использую UIBezierPath для рисования слоя фигуры. Он работает отлично, но я получаю некоторые нечетные результаты, когда я рисую. Геометрия не ведет себя так, как ожидалось. Я пытаюсь сделать простой «кусок пирога» в правом верхнем углу:Почему добавление addArcWithCenter в startAngle из 0 градусов заставляет его начинать с 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; 

Конечным результатом является то, что кусочек пирога втягивается в нижнем правом углу. Первая точка дуги рисуется на 90 градусов, а затем на 180. Почему она делает это, хотя я использую 0 и 90 градусов?

ответ

67

Изображение изображения прямо с the documentation.

image

И есть обсуждение того, как она работает (с учетом по умолчанию система координат)

Обсуждение
Этот метод добавляет указанную дугу, начинающуюся в текущей точке. Созданная дуга лежит по периметру указанного круга. При рисовании в системе координат по умолчанию начальный и конечный углы основаны на единичном круге, показанном в . Рис. 1. Например, задавая начальный угол 0 радиан, конечный угол π радианов и устанавливая параметр по часовой стрелке на YES, вытягивает нижнюю половину круга. Однако, задавая одинаковые начальные и конечные углы, но установка параметра clockwise, установленного на NO, рисует верхнюю половину круга.

Вот как работают углы для addArcWithCenter:radius:startAngle:endAngle:clockwise:. Если это не то, что вы видите, вы неправильно вычисляете свои углы.

9

Посмотрите Рисунок 1 в документации bezierPathWithArcCenter:radius:startAngle:endAngle:clockwise:: Для «пирога кусочек» в верхнем правом углу вы должны использовать параметры

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

(Причина заключается в том, что координата по умолчанию система на iOS имеет ось x, указывающую вправо, а ось y направлена ​​вниз.)

 Смежные вопросы

  • Нет связанных вопросов^_^