检测iPhone的屏幕方向

问题描述:

我想要以45度的增量检测iPhone的方向。理想情况下,我希望能够沿任何轴获取定位角度。检测iPhone的屏幕方向

我需要做的检测类似于当方向更改时,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 

我觉得你的问题是,你正在使用int变量,当你想float

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

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

应该给你更多你所期待的。

+0

感谢您的回复,我将代码更改为使用int整数,但我仍然得到当设备平躺时计算的波动值大幅波动的结果。 – Simon 2009-06-16 07:29:25

原因是你使用局部变量,而他们不应该是本地的。

尽量做到以下几点:

声明实例变量:在加速度计委托

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

... 

other declarations 

更新变量:

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

应该给予更精确的结果,而不突然跳跃。