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

什么是识别“旋转”的最好方法,或者更清楚地描述,当用户在顺时针或逆时针方向上按轮子和旋转他/她的拇指时。
我无疑想要使用touchesBegan/touchesMoved/touchesEnded.不过,怎样才能找到旋转的最佳方法呢?
我在想
( a)在touchesMoved中,通过确定中心点的半径,确定用户触点是否在圆圈内。中心点和半径很容易得到。然而,使用这些方法,如何确定圆圈/车轮的外部边缘.要知道用户是否在实际的圆圈内(他们的触摸仍然可以在视图中,但在实际的车轮部分之外)
b)确定当前的角度及其如何改变以前的角度。我的意思是..。我会用圆心点作为一个点,用户当前的触点作为第二个点。这给了我矢量。我也会有一个基线角度。中心可能指向12点。我会比较这两个向量(我已经从我正在做的事情中得到了一个VectorMath类),并且看到我的角度是0。如果用户的触觉是在3点,我将其与基线角度进行比较.我会看到这个角度是90度。我会不断计算角度,也许每5度变化一次.将需要更改控件输出(取决于所需的灵敏度)。
这看起来是最好的方法吗?我认为这将是一个理想的方法,但仍然不确定如何计算圆圈的外部边缘,并确定用户是否触摸在其中。
发布于 2016-02-17 12:16:43
你走在正确的轨道上。我认为方法b)是可行的。
要确定触摸事件是否在圆环内,请计算从圆心到触点的距离。它应该在最小距离和最大距离之间(内圆和外圆半径)。计算两点之间的距离在https://www.mathsisfun.com/algebra/distance-2-points.html上解释。
发布于 2016-02-17 12:25:10
我想你快到了,尽管我会在你的b点上做一些稍微不同的事情。
如果你想一想,当你开始在你的iPod上“旋转”的时候,你不需要从一个精确的位置开始,你从“你开始的地方”开始旋转,因此我不会把我的“基线角度”设置在π/2,我会第一次在用户点击点设置我的基线(或0°)角度,从那时开始,我会计算偏移角,顺时针方向和逆时针方向。我不认为会有太大的区别,除非你可能会在角度上做一些计算,实际上,在这两种方法上;从第一个输入评分器开始计数比将基线设置为π/2和计算第一个角度更有意义。
发布于 2016-02-17 12:53:05
我要分部分回答。
// 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);下一首
[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))];和
- (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。
https://stackoverflow.com/questions/35456352
复制相似问题