检测iPhone屏幕方向

时间:2009-06-16 05:13:26

标签: iphone orientation accelerometer

我想以45度的增量检测iPhone的方向。理想情况下,我希望能够沿任意轴获得方向角。

我需要做的检测类似于当T方向改变时,iPhone的Trism如何朝向屏幕的当前底部位置闪烁箭头。

我有一些编码但实际上不明白加速度计读数如何工作并且可以在正确的方向上使用微调。我当前的代码记录了当前的角度,但即使手机是平的,我的读数每秒也会变化很多。

- (void) checkOrientation:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
    int accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
    int accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);

    float currentRawReading = (atan2(accelerationY, accelerationX)) * 180/M_PI;
    NSLog(@"Angle: %f",currentRawReading);
}

电话平坦时来自日志的示例:

2009-06-16 17:29:07.987 [373:207] Angle: 0.162292
2009-06-16 17:29:07.994 [373:207] Angle: 179.838547
2009-06-16 17:29:08.014 [373:207] Angle: 179.836182
2009-06-16 17:29:08.032 [373:207] Angle: -90.000000
2009-06-16 17:29:08.046 [373:207] Angle: 179.890900
2009-06-16 17:29:08.059 [373:207] Angle: -90.000000
2009-06-16 17:29:08.074 [373:207] Angle: 179.917908
2009-06-16 17:29:08.088 [373:207] Angle: -179.950424
2009-06-16 17:29:08.106 [373:207] Angle: 90.000000
2009-06-16 17:29:08.119 [373:207] Angle: 90.000000
2009-06-16 17:29:08.134 [373:207] Angle: -179.720245

2 个答案:

答案 0 :(得分:4)

我认为您的问题是,当您需要int时,您正在使用float个变量。

我认为accelerationX和-Y应该是实例变量,因此:

accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);

应该为您提供更多您想要的东西。

答案 1 :(得分:3)

原因是你正在使用局部变量,而它们不应该是本地变量。

尝试执行以下操作:

声明实例变量:

@interface YourViewControllerClass: UIViewController {
    float accelerationX, accelerationY;
}

...

other declarations

更新加速度计委托中的变量:

 accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
 accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);

它应该在没有突然跳跃的情况下提供更精确的结果。