立即检测iOS方向变化

我有一个游戏,其中设备的方向影响游戏的状态。 用户必须快速在风景,人像和逆向风景方向之间切换。 到目前为止,我一直在通过以下方式注册游戏定位通知:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

但是速度太慢了 – 在旋转电话和实际被触发的通知之间似乎还有第二次延迟。 我需要一种方法来即时检测设备方向的变化。 我尝试过用陀螺仪进行试验,但还不够熟悉,不知道它是否是我正在寻找的解决scheme。

你所说的延迟实际上是一个filter,以防止错误的(不需要的)方向改变通知。

为了即时识别设备方向的变化,您只需要自己监控加速度计。

加速度计测量所有3个轴中的加速度(包含重力),因此在计算实际方向时不应有任何问题。

一些代码开始使用加速度计可以在这里find:

如何制作iPhone应用程序 – 第5部分:加速度计

这个不错的博客涵盖了math部分:

使用加速度计

viewWillAppear函数中添加一个通知器

 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; } 

方向改变通知这个function

 - (void)orientationChanged:(NSNotification *)notification{ [self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; } 

然后在处理moviePlayerController框架的地方调用这个函数

 - (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation { switch (orientation) { case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: { //load the portrait view } break; case UIInterfaceOrientationLandscapeLeft: case UIInterfaceOrientationLandscapeRight: { //load the landscape view } break; case UIInterfaceOrientationUnknown:break; } } 

viewDidDisappear删除通知

 -(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; } 

我想这是最快的你可以根据方向改变视图

为什么你没有使用

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

或者你可以使用这个

 -(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

或这个

 -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

希望猫头鹰有用)

对于我的情况处理UIDeviceOrientationDidChangeNotification是不是很好的解决scheme,因为它被称为更频繁和UIDeviceOrientation并不总是等于UIInterfaceOrientation因为(FaceDown,FaceUp)。

我使用UIApplicationDidChangeStatusBarOrientationNotification处理它:

 //To add the notification [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation:) //to remove the [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; ... - (void)didChangeOrientation:(NSNotification *)notification { UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if (UIInterfaceOrientationIsLandscape(orientation)) { NSLog(@"Landscape"); } else { NSLog(@"Portrait"); } } 

尝试在以下方面进行更改:

- (void) viewWillLayoutSubviews {}

随着子视图重新布局,代码将在每个方向上更改。

@vimal答案没有为我提供解决scheme。 这个方向似乎不是目前的方向,而是从以前的方向。 为了解决这个问题,我使用[[UIDevice currentDevice] orientation]

 - (void)orientationChanged:(NSNotification *)notification{ [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]]; } 

然后

 - (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... } 

用这个代码我得到当前的方向位置。