iOS环形控制器、环形按钮

时间:2024-10-05 20:03:08

这两天接手了一个外包的UI,有一个环形的控制器,需求改啊改的:“安卓已经实现了……”,最讨厌这句了,最后做了一版,对方终于满意了,删掉其他的繁琐部分,留下控制器部分,大家看看,有更好的想法欢迎分享。

惯例,先上图

iOS环形控制器、环形按钮

源码在这里

给大家做个分析吧:

iOS环形控制器、环形按钮

核心代码解析:

 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.image];//取点 CGPoint pointerposition = [self getPoint:point];//加工点
double radian = [self getradian:pointerposition];//求弧度
if (radian>-0.81&&radian<3.99) {//根据弧度范围处理点的运动
_pointer.transform = CGAffineTransformMakeRotation(- (radian - M_PI_2));
_pointer.center = pointerposition;
}
} - (double)getradian:(CGPoint)point//利用点求弧度
{
point.x -= _center.x;
point.y -= _center.y;
double cosp = point.x / _radius;//求余弦
double radian = acos(cosp);//转弧度
radian = (radian < M_PI_2 && point.y > ) ? - radian : radian;//判断象限,注意屏幕坐标系的方向
radian = (radian > M_PI_2 && point.y > ) ? M_PI * - radian : radian;
return radian;
} - (CGPoint) getPoint:(CGPoint)point//将触摸点,转换成圆周上的点
{
point.x -= _center.x;
point.y -= _center.y;//以上两步为了将左边系的原点固定到圆心,
double r = sqrt(point.x * point.x + point.y * point.y) / _radius;
point.x /= r;
point.y /= r;
point.x += _center.x;
point.y += _center.y;//按照比例求出对应的圆上的点
return point;
}