1. 程式人生 > >iOS 獲取圓環終點位置的座標方法 (UIBezierPath 終點位置)

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