iphone - 如何跟踪 iOS 应用程序中图像的完整旋转总数?

标签 iphone ios

我正在开发一款具有旋转图像的应用程序(用户点击并拖动,图像会沿着他们的手指旋转一圈)。我想要跟踪的是用户完成了多少次完整的圆圈。另一个“障碍”是我还需要知道用户是顺时针还是逆时针转圈。

这是旋转图像的代码...请随时索取更多信息。

   - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    long double rotationNumber = atan2(touchPoint.y - originY, touchPoint.x - originX);

    totalRotationCount ++;

    schedulingWheel.transform = CGAffineTransformMakeRotation(rotationNumber);

    offset = (rotationNumber * 100)/14;

    dateRibbon.center = CGPointMake(offset, 24);  
}

感谢您的帮助!

最佳答案

我的解决方案并不优雅,我可能还缺少一个更简洁的解决方案,但这是我最近所做的。诀窍是跟踪自上次调用 touchesMoved: 以来的角度。然后,将当前角度的增量和存储的角度值添加到总数中。

问题是 atan2 创建的“边界”需要丑陋的代码来克服。假设您的 lastAngle 是 359,并且您穿过原点,所以您的下一个角度是 1。差值将不是 2,而是 -358,所以每当您越过该边界时,您的总角将重置为 0。

这是我做的:

 CGFloat angle = atan2f(center.y - point.y, point.x - center.x);

 //Translate to Unit circle
 if (angle > 0) {
     angle = (M_PI - angle) + M_PI;
 } else {
     angle = fabsf(angle);
 }

 CGFloat delta = angle - lastAngle;

 //Adjust for boundaries
 if (fabsf(delta) > (2*M_PI)-fabsf(delta)) {
      BOOL greaterThanZero = (delta > 0);
      delta = (2*M_PI)-fabsf(delta);
      if (greaterThanZero) {
           delta = -1 * delta;
      }
  }

  totalAngle += delta;
  lastAngle = angle;

“调整边界”下的大/丑条件基本上只是看看是否有更短的角度到达新点(所以,2 而不是 -258)并假设如果有它可能意味着你越过原点并相应地调整增量。

我翻译了 Atan2 结果,使其代表从 0 到 2π 的完整单位圆。额外的副作用是,它比 Atan2 的标准 -π 到 π 更好地解释了顺时针/逆时针运动。

关于iphone - 如何跟踪 iOS 应用程序中图像的完整旋转总数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8822891/

相关文章:

ios - 我是否需要在 Thread 中运行 AudioServicesCreateSystemSoundID

iOS 8.0 UIWebView 文件输入崩溃我的应用程序

iphone - CCHmac 上的 EXC_BAD_ACCESS

iphone - xpath查询问题

ios - React-native:panResponder 内部的 ScrollView

ios - 将 UITableView 行从一个 tableviewController 发送到另一个

ios - 处理来自移动麦克风的音频输入而不将其保存到文件中

iPhone应用程序审批问题

iOS 7 MPVolumeView 改变大小

swift - 如何修复我的导航栏后退按钮?