UIDeviceOrientationDidChangeNotification返回的设备方向不准确

时间:2010-08-01 02:41:55

标签: iphone

我正在收听UIDeviceOrientationDidChangeNotification,以便根据设备的方向调整我的UI。

问题是我从通知中获得的设备方向似乎不准确。如果我以纵向和纵向开始使用手机(就像用它拍照一样),我从通知中获得的方向是正确的。随着手机的倾斜度接近水平(如平放在桌面上),方向切换到横向。这种情况发生在电话实际上在桌子上平放之前。这根本就没有将手机转向风景。就好像它偏爱景观一样。

使用其他应用程序(如邮件)时,我看不到同样的行为。邮件似乎只有在确定你已经进入新的方向时才会切换方向。

非常感谢任何帮助。

谢谢,

3 个答案:

答案 0 :(得分:9)

我发现了我的问题。

在viewWillAppear中我有:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(didChangeOrientation:) name: UIDeviceOrientationDidChangeNotification object: 
     [UIDevice currentDevice]];

这是通知处理程序:

- (void) didChangeOrientation: (id)object {
    UIInterfaceOrientation interfaceOrientation = [[object object] orientation];
    //DLog(@"val is %i", interfaceOrientation);
    if (interfaceOrientation == UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight || interfaceOrientation == UIDeviceOrientationPortrait) {
    [self orientInterface:interfaceOrientation];
}

通过检查方向是两个风景中的一个或两个肖像,我忽略了UIDeviceOrientationFaceUp和UIDeviceOrientationFaceDown方向。这样,将手机设置为这两个方向之一就不会对我的界面方向产生影响。

我的问题是我没有考虑faceUp和faceDown,而是在一个假定为landscape的else语句中处理它们。

答案 1 :(得分:3)

如果您唯一感兴趣的是界面方向(即设备的横向或纵向),则不应使用UIDevice:orientation(或UIDeviceOrientation *常量,如果愿意),而是使用UIApplication:statusBarOrientation,它使用UIInterfaceOrientation *常量。

我使用以下代码检查横向模式:

static inline bool isOrientationIsLandscape() {
    return UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]);
}

对于肖像模式:

static inline bool isOrientationIsPortrait() {
    return UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]);
}

由于模拟器上没有UIDeviceOrientationFace [Up | Down],只有在真实设备上才会花费我一整个上午的时间。所以我的应用程序一直在模拟器上工作,但在实际的设备上,我偶尔会在测试期间有一些未定义的行为。

现在它可以像在模拟器上那样在实际设备上运行。

HTH

答案 2 :(得分:1)

通知只是获取它的一种方式,你也可以自己读出加速度计并以你认为合适的方式实现它(例如延迟和一定的非旋转时间)。

不知道是否有耗电量来获取这些读数,但如果是这样,请使用通知知道什么时候移动,然后启动accelometer读数。