在旋转之前获取设备方向或在启动时强制它。有任何想法吗?

时间:2009-10-28 17:10:42

标签: iphone cocoa-touch rotation

我很快就会有截止日期,我面前有一个非常讨厌的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
    }

如果我将设备放在桌面上或手中(水平位置)并运行我的应用程序,可以轻松复制此错误,它会在纵向屏幕中绘制类似横向的矩形。

我的问题是:在这种情况下我能以某种方式获得正确的方向吗?太糟糕了,它无法在模拟器中重现,所以我不确定我粘贴的代码是否对此错误负责,但这是我根据方向修复视图帧的地方。也许还有另一种(正确的)方法吗?也许我可以强制应用程序处于纵向模式,直到旋转事件被触发?

2 个答案:

答案 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应该可以用于您的目的。