首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使"iPod车轮“类型的控制在iPhone上?

如何使"iPod车轮“类型的控制在iPhone上?
EN

Stack Overflow用户
提问于 2016-02-17 12:10:17
回答 3查看 211关注 0票数 1

我想在我正在做的Swift项目中创建一种“Swift车轮”控件。我已经把一切都做好了,但现在还不是让这件事真正发挥作用的时候。

什么是识别“旋转”的最好方法,或者更清楚地描述,当用户在顺时针或逆时针方向上按轮子和旋转他/她的拇指时。

我无疑想要使用touchesBegan/touchesMoved/touchesEnded.不过,怎样才能找到旋转的最佳方法呢?

我在想

( a)在touchesMoved中,通过确定中心点的半径,确定用户触点是否在圆圈内。中心点和半径很容易得到。然而,使用这些方法,如何确定圆圈/车轮的外部边缘.要知道用户是否在实际的圆圈内(他们的触摸仍然可以在视图中,但在实际的车轮部分之外)

b)确定当前的角度及其如何改变以前的角度。我的意思是..。我会用圆心点作为一个点,用户当前的触点作为第二个点。这给了我矢量。我也会有一个基线角度。中心可能指向12点。我会比较这两个向量(我已经从我正在做的事情中得到了一个VectorMath类),并且看到我的角度是0。如果用户的触觉是在3点,我将其与基线角度进行比较.我会看到这个角度是90度。我会不断计算角度,也许每5度变化一次.将需要更改控件输出(取决于所需的灵敏度)。

这看起来是最好的方法吗?我认为这将是一个理想的方法,但仍然不确定如何计算圆圈的外部边缘,并确定用户是否触摸在其中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-17 12:16:43

你走在正确的轨道上。我认为方法b)是可行的。

  1. 记住手指在touchesBegan事件中的起始位置。
  2. 想象一下从手指位置到按钮圆圈中间的一条线。
  3. 对于touchesMoved事件,同样,想象一条从新位置到圆心的虚拟线。
  4. 使用http://mathworld.wolfram.com/Line-LineAngle.html (或某些code)中的公式,您可以确定这两条线之间的角度。如果它是一个负的角度,用户是逆时针旋转车轮,否则它是顺时针。

要确定触摸事件是否在圆环内,请计算从圆心到触点的距离。它应该在最小距离和最大距离之间(内圆和外圆半径)。计算两点之间的距离在https://www.mathsisfun.com/algebra/distance-2-points.html上解释。

票数 2
EN

Stack Overflow用户

发布于 2016-02-17 12:25:10

我想你快到了,尽管我会在你的b点上做一些稍微不同的事情。

如果你想一想,当你开始在你的iPod上“旋转”的时候,你不需要从一个精确的位置开始,你从“你开始的地方”开始旋转,因此我不会把我的“基线角度”设置在π/2,我会第一次在用户点击点设置我的基线(或0°)角度,从那时开始,我会计算偏移角,顺时针方向和逆时针方向。我不认为会有太大的区别,除非你可能会在角度上做一些计算,实际上,在这两种方法上;从第一个输入评分器开始计数比将基线设置为π/2和计算第一个角度更有意义。

票数 1
EN

Stack Overflow用户

发布于 2016-02-17 12:53:05

我要分部分回答。

代码语言:javascript
复制
// Get a position based on the angle
      float xPosition = center.x + (radiusX * sinf(angleInRadians)) - (CGRectGetWidth([cell frame]) / 2);
      float yPosition = center.y + (radiusY * cosf(angleInRadians)) - (CGRectGetHeight([cell frame]) / 2);

      float scale = 0.75f + 0.25f * (cosf(angleInRadians) + 1.0);

下一首

代码语言:javascript
复制
[cell setTransform:CGAffineTransformScale(CGAffineTransformMakeTranslation(xPosition, yPosition), scale, scale)];
         // Tweak alpha using the same system as applied for scale, this
         // time with 0.3 the minimum and a semicircle range of 0.5
         [cell setAlpha:(0.3f + 0.5f * (cosf(angleInRadians) + 1.0))];

代码语言:javascript
复制
- (void)spin:(SpinGestureRecognizer *)recognizer
{
   CGFloat angleInRadians = -[recognizer rotation];
   CGFloat degrees = 180.0 * angleInRadians / M_PI;   // Radians to degrees
   [self setCurrentAngle:[self currentAngle] + degrees];
   [self setAngle:[self currentAngle]];
}

再检查一下github中的光轮.m。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35456352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档