我正在收听UIDeviceOrientationDidChangeNotification,以便根据设备的方向调整我的UI。
问题是我从通知中获得的设备方向似乎不准确。如果我以纵向和纵向开始使用手机(就像用它拍照一样),我从通知中获得的方向是正确的。随着手机的倾斜度接近水平(如平放在桌面上),方向切换到横向。这种情况发生在电话实际上在桌子上平放之前。这根本就没有将手机转向风景。就好像它偏爱景观一样。
使用其他应用程序(如邮件)时,我看不到同样的行为。邮件似乎只有在确定你已经进入新的方向时才会切换方向。
非常感谢任何帮助。
谢谢,
答案 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读数。