Search code examples
iosangleuibezierpathcashapelayer

start and end angle of UIBezierPath?


I have coded as below for half circle in iOS using UIBezierPath and CAShapeLayer.

 clockWiseLayer = [[CAShapeLayer alloc] init];

CGFloat startAngle = -M_PI_2;
CGFloat endAngle = M_PI + M_PI_2;

CGFloat width = CGRectGetWidth(imageView.frame)/2.0f + 30;
CGFloat height = CGRectGetHeight(imageView.frame)/2.0f +50;
CGPoint centerPoint = CGPointMake(width, height);

float radius = CGRectGetWidth(imageView.frame)/2+10;

clockWiseLayer.path = [UIBezierPath bezierPathWithArcCenter:centerPoint
                                                    radius:radius
                                                startAngle:startAngle
                                                  endAngle:endAngle
                                                 clockwise:YES].CGPath;

clockWiseLayer.fillColor = [UIColor clearColor].CGColor;
clockWiseLayer.strokeColor = [UIColor blueColor].CGColor;
clockWiseLayer.borderColor = [UIColor greenColor].CGColor;
clockWiseLayer.backgroundColor = [UIColor redColor].CGColor;

clockWiseLayer.strokeStart = 0.0f;
clockWiseLayer.strokeEnd = 0.5f;

clockWiseLayer.lineWidth = 2.0f;
clockWiseLayer.borderWidth = 5.0f;

clockWiseLayer.shouldRasterize = NO;
[self.layer addSublayer:clockWiseLayer];

This results as below.

enter image description here

I want this blue half circle on the opposite side of the World Globe.

It is half Circle, but I want it on the other side, also CounterClockWise.

I am unable to set start and end angle for that, while clockwise:NO.

Thanks.


Solution

  • Check documentation for coordinates: https://i.sstatic.net/1yJo6.png

    enter image description here

    Y-Axis is reversed compared to standard coordinate system in mathematics.

    You should draw from 1/2*PI (bottom anchor) to 3/2*PI (top anchor) and then you set strokeStart to 0.0f and strokeEnd to 1.0f (so it fills whole path).

    Working code using iOS constants:

    CGFloat startAngle = M_PI_2;
    CGFloat endAngle = startAngle + M_PI;
    CGFloat width = CGRectGetWidth(imageView.frame)/2.0f;
    CGFloat height = CGRectGetHeight(imageView.frame)/2.0f;
    CGPoint centerPoint = CGPointMake(width, height);
    float radius = CGRectGetWidth(imageView.frame)/2+10;
    CAShapeLayer* clockWiseLayer = [[CAShapeLayer alloc] init];
    clockWiseLayer.path = [UIBezierPath bezierPathWithArcCenter:centerPoint
                                                         radius:radius
                                                     startAngle:startAngle
                                                       endAngle:endAngle
                                                      clockwise:YES].CGPath;
    
    clockWiseLayer.fillColor = [UIColor clearColor].CGColor;
    clockWiseLayer.strokeColor = [UIColor blueColor].CGColor;
    clockWiseLayer.borderColor = [UIColor greenColor].CGColor;
    clockWiseLayer.backgroundColor = [UIColor redColor].CGColor;
    
    clockWiseLayer.strokeStart = 0.0f;
    clockWiseLayer.strokeEnd = 1.0f;
    
    clockWiseLayer.lineWidth = 2.0f;
    clockWiseLayer.borderWidth = 5.0f;
    [self.layer addSublayer:clockWiseLayer];