iOS 獲取圓環終點位置的座標方法 (UIBezierPath 終點位置)
阿新 • • 發佈:2019-02-01
目標是下圖的情況:
畫一個圓弧,在圓弧結束位置放置一個紅色圓點
這需要先假想一個座標系效果如下
由於貝塞爾曲線是順時針方向繪製的,所以可以順時針想像成四個象限
獲取位置方法步驟:
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