我很快就会有截止日期,我面前有一个非常讨厌的bug,没有任何想法,如何修复它。问题是,有时设备在旋转之前不知道它的方向是什么,因此它会在条件语句中混淆帧:
if (orient == UIInterfaceOrientationPortrait || orient == 0){
r = CGRectMake(0.0, 0.0, 320.0, 480.0);
// draw stuff
} else {
r = CGRectMake(0.0, 0.0, 480.0, 320.0);
// draw stuff
}
如果我将设备放在桌面上或手中(水平位置)并运行我的应用程序,可以轻松复制此错误,它会在纵向屏幕中绘制类似横向的矩形。
我的问题是:在这种情况下我能以某种方式获得正确的方向吗?太糟糕了,它无法在模拟器中重现,所以我不确定我粘贴的代码是否对此错误负责,但这是我根据方向修复视图帧的地方。也许还有另一种(正确的)方法吗?也许我可以强制应用程序处于纵向模式,直到旋转事件被触发?
答案 0 :(得分:1)
确定设备方向的传感器既不可靠也不智能。如果你把手机放在桌子上,然后走动它,怎么知道它是颠倒的?
答案 1 :(得分:1)
我不认为这是一个错误。当iPhone坐在桌子上时,所有的重力都沿着Z轴测量。要确定设备方向,请使用x-y轴,但在您的方案中不会测量加速度。
编辑:进一步解释:
此图显示了Axis在iPhone上的定位方式: alt text http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIAcceleration_Class/Art/device_axes.jpg
因此,当您将iPhone放在背面时,z轴上的加速度为-1g。要接收测量的加速度,只需向UIAccelerometerDelegate
共享实例注册实施UIAccelerometer
的代理。请参阅AccelerometerGraph示例如何完成此操作。
要确定iphone是否坐在桌子上,请执行以下操作:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
// lowPass filter first
// now choose orientation
if (fabs([acceleration z]) >= 0.9) // sitting on the table: choose new mode or lock current mode
if (fabs([acceleration y]) >= 0.9) // probably portrait mode
if (fabs([acceleration x]) >= 0.9) // probably landscape mode
}
加速度计精度为18mG = 0.018G
,因此请将其考虑在内。
此外,您需要将自己与即时移动变化的效果隔离开来,简单的LowPass过滤器完全符合此法案。 AccelerometerGraph示例显示了如何实现这样的过滤器。
如果您不需要很高的精度,也可以选择一个非常低的updateInterval,30Hz应该可以用于您的目的。