Xcode中的径向拨号

时间:2012-01-06 20:20:05

标签: iphone xcode4 ios4

我正在尝试制作一个使用径向拨号的应用。作为示例,径向拨号功能在此应用程序中可用

http://itunes.apple.com/us/app/kitchen-dial/id448558628?mt=8&ign-mpt=uo%3D4

我想问的是我应该用什么方法来实现这个目标?伙计们,我不是要求你为我编写代码我要问的是这是如何在概念上完成的?我的意思是当用户在屏幕上向左/向右旋转时,它如何知道要移动哪个径向刻度盘以及在哪个方向上移动。我确信有多个按钮,这里有一些图像转换。我需要理解制作这样一个东西的概念。如果有人知道或做过类似的事情,请分享您的想法。 apple有一个示例代码吗?谢谢。

3 个答案:

答案 0 :(得分:2)

核心概念是:

  • 能够围绕中心点旋转图像。

  • 能够在给定x,y坐标的情况下计算相对于中心点的角度。

所以,移动方向盘:

  • 触摸开始:
    • 根据x,y
    • 计算起始角度
  • 触摸移动:
    • 根据x,y计算新角度并减去起始角度。这是角度增量(或旋转图像多少)。

注册方向盘上的按钮水龙头:

  • 点按:
    • 根据x,y计算角度,添加现有旋转,除以每个线段的角度大小以获得索引。

你要求对这些概念进行高级别的解释 - 这就是它。

答案 1 :(得分:1)

这是一个复杂的问题。简单的答案是:使用平移手势识别器,使用:

- (void)panBegan:(UIPanGestureRecognizer *)pan {
  CGRect frame = [self frame];
  _central = CGPointMake(frame.origin.x+frame.size.width/2, frame.origin.y+frame.size.height/2);
  CGPoint p = [pan locationInView:[self superview]];
  p.x -= _central.x;
  p.y -= _central.y;

  _angle = atan2(p.x, p.y);
}

- (void)panMoved:(UIPanGestureRecognizer *)pan {
  CGPoint p = [pan locationInView:[self superview]]];
  p.x -= _central.x;
  p.y -= _central.y;
  CGFloat deltaAngle = _angle - atan2(p.x, p.y);
  self.transform = CGAffineTransformMakeRotation(deltaAngle + _finalAngle);
}

其中_angle是平移初始触摸的角度,_finalAngle是前一平移结束时保存的角度。

但是:UIPanGestureRecognizer有一个力度属性,你应该在平底锅的末端使用它来继续旋转,就像表盘有惯性一样。并且,如果表盘具有一组固定的合法停止位置,那么您必须调整减速曲线,使其在合法停止时停止。并且,如果您为减速度设置动画,并且用户在前一个完成之前启动新的平移,则必须根据感知位置而不是存储位置调整_finalAngle。

答案 2 :(得分:0)

以下是开源旋钮的列表,因此您可以查看代码并查看所涉及的内容:

http://maniacdev.com/2011/12/open-source-libraries-for-easily-adding-rotary-knob-controls-in-your-ios-apps/