我使用 UIBezierPath 和 CAShapeLayer 在iOS中编码如下半圈。
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];
结果如下。
我希望在世界地球仪的另一侧有一个蓝色半圈。
这是半圈,但我想在另一边,也是CounterClockWise。
我无法设置开始和结束角度,而顺时针:否。
感谢。
答案 0 :(得分:21)
检查坐标的文档: http://i.stack.imgur.com/1yJo6.png
与数学中的标准坐标系相比,Y轴相反。
您应该从1/2 * PI(底部锚点)绘制到3/2 * PI(顶部锚点)然后将strokeStart设置为0.0f并将strokeEnd设置为1.0f(因此它将填充整个路径)。
使用iOS常量的工作代码:
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];
答案 1 :(得分:6)
您从-M_PI_2
的圆圈开始,到M_PI + M_PI_2
结束(如果您想要完整的圆圈并使用strokeEnd
,strokeStart
)限制它。然后将圆形路径设置为从路径末端的一半(图像的左侧)而不是从开始到一半(图像的右侧)绘制
CGFloat startAngle = -M_PI_2;
CGFloat endAngle = M_PI + M_PI_2;
clockWiseLayer.strokeStart = .5f;
clockWiseLayer.strokeEnd = 1.0f;
答案 2 :(得分:1)
我玩bin/rails -v
,如果{{1}},它会很奇怪。但是如果你想用逆时针方向创建一个圆弧贝塞尔路径,你可以创建一个顺时针路径,然后用bezierPathByReversingPath
具有相同路径形状但为其反向创建路径的新路径对象。