iOS 获取圆环终点位置的坐标方法 (UIBezierPath 终点位置)

目标是下图的情况:


画一个圆弧,在圆弧结束位置放置一个红色圆点

这需要先假想一个坐标系效果如下


由于贝塞尔曲线是顺时针方向绘制的,所以可以顺时针想像成四个象限

获取位置方法步骤:

1、确定所在的角度是多少

2、确定象限

3、后通正弦余弦函数来确定x、y值

4、最终得出在整个layer 中的位置


具体算法

//更新小点的位置
-(CGRect)getEndPointFrameWithProgress:(float)progress
{
    CGFloat angle = M_PI*2.0*progress;//将进度转换成弧度
    float radius = (_backView.bounds.size.width-_lineWidth)/2.0;//半径
    int index = (angle)/M_PI_2;//用户区分在第几象限内
    float needAngle = angle - index*M_PI_2;//用于计算正弦/余弦的角度
    float x = 0,y = 0;//用于保存_dotView的frame
    switch (index) {
        case 0:
            NSLog(@"第一象限");
            x = radius + sinf(needAngle)*radius;
            y = radius - cosf(needAngle)*radius;
            break;
        case 1:
            NSLog(@"第二象限");
            x = radius + cosf(needAngle)*radius;
            y = radius + sinf(needAngle)*radius;
            break;
        case 2:
            NSLog(@"第三象限");
            x = radius - sinf(needAngle)*radius;
            y = radius + cosf(needAngle)*radius;
            break;
        case 3:
            NSLog(@"第四象限");
            x = radius - cosf(needAngle)*radius;
            y = radius - sinf(needAngle)*radius;
            break;
            
        default:
            break;
    }
    //为了让圆圈的中心和圆环的中心重合
    x -= (_redDot.bounds.size.width/2.0f - _lineWidth/2.0f);
    y -= (_redDot.bounds.size.width/2.0f - _lineWidth/2.0f);
    //更新圆环的frame
    CGRect rect = _redDot.frame;
    rect.origin.x = x;
    rect.origin.y = y;
    return  rect;
}


☞  Demo

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 5

打赏作者

吴彦祖666

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值