start and end angle of UIBezierPath?

前端 未结 3 1488
遇见更好的自我
遇见更好的自我 2021-02-07 23:36

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

 clockWiseLayer = [[CAShapeLayer alloc] init]         


        
相关标签:
3条回答
  • 2021-02-07 23:53

    I have played with bezierPathWithArcCenter and it works quite strange if clockwise = NO. But if you want to create an circle bezier path with conterclockwise direction you can create a clockwise path and then revert it with bezierPathByReversingPath

    A new path object with the same path shape but for which the path has been created in the reverse direction.

    0 讨论(0)
  • 2021-02-08 00:00

    Check documentation for coordinates: http://i.stack.imgur.com/1yJo6.png

    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];
    
    0 讨论(0)
  • 2021-02-08 00:11

    You start from top of the circle with -M_PI_2 and end at M_PI + M_PI_2 (if you want to have full circle and limit it using strokeEnd, strokeStart). Then set the circle path to draw from half of the end of the path (left side of image) instead from beginning to half (right side of the image)

    CGFloat startAngle = -M_PI_2;
    CGFloat endAngle = M_PI + M_PI_2;
    
    clockWiseLayer.strokeStart = .5f;
    clockWiseLayer.strokeEnd = 1.0f;
    
    0 讨论(0)
提交回复
热议问题