我有一个游戏中,设备的取向也影响了比赛的状态。 用户必须横向,纵向之间快速切换,并反向横向方向。 到目前为止,我已经注册的游戏通过定向通知:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
但它实在太慢 - 似乎有大约旋转实际上被解雇的电话和通知之间的第二延迟。 我需要一种可以即时检测设备的方向变化。 我曾尝试与陀螺仪进行实验,但我还没有足够的与它熟悉,知道它是否是我要寻找的解决方案。
我有一个游戏中,设备的取向也影响了比赛的状态。 用户必须横向,纵向之间快速切换,并反向横向方向。 到目前为止,我已经注册的游戏通过定向通知:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
但它实在太慢 - 似乎有大约旋转实际上被解雇的电话和通知之间的第二延迟。 我需要一种可以即时检测设备的方向变化。 我曾尝试与陀螺仪进行实验,但我还没有足够的与它熟悉,知道它是否是我要寻找的解决方案。
你谈论的是延迟实际上是一个过滤器,以防止错误的(不必要的)方向变化的通知。
对于设备方向的改变即时识别你只是要去有自己监测加速度计。
加速度计测量加速度(重力包括)所有3个轴,所以你不应该搞清楚实际取向的任何问题。
一些代码开始与加速度计的工作可以在这里找到:
如何使一个iPhone应用程序- 5部分:加速度计
而这个不错的博客涵盖了数学部分:
使用加速度计
添加一个通知在viewWillAppear
功能
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
}
方位变化通知此功能
- (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];
}
我想这是ü可以改变了看法按方位最快
为什么你didn`t使用
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
?
或者您可以使用此
-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
或这个
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
希望这猫头鹰是有用的)
对于我的办案UIDeviceOrientationDidChangeNotification
并不像它被称为更频繁和更良好的解决方案UIDeviceOrientation
并不总是等于UIInterfaceOrientation
因为(面朝下,面朝上)的。
我处理使用它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答案并没有为我提供解决方案。 看来取向不是当前的方向,但是从前面的方向。 为了解决这个问题,我用[[UIDevice currentDevice] orientation]
- (void)orientationChanged:(NSNotification *)notification{
[self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]];
}
然后
- (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... }
有了这个代码,我得到当前方向的位置。