检测iPhone屏幕方向
-
14-09-2019 - |
题
我想以45度增量检测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);
应该给您更多想要的东西。
其他提示
原因是您使用本地变量,而它们不应该是本地变量。
尝试执行以下操作:
声明实例变量:
@interface YourViewControllerClass: UIViewController {
float accelerationX, accelerationY;
}
...
other declarations
加速度计委托中的更新变量:
accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);
它应该给出更精确的结果而不会突然跳跃。
不隶属于 StackOverflow