检测iOS的方向变化瞬间检测iOS的方向变化瞬间(Detecting iOS orientation

2019-05-12 23:24发布

我有一个游戏中,设备的取向也影响了比赛的状态。 用户必须横向,纵向之间快速切换,并反向横向方向。 到目前为止,我已经注册的游戏通过定向通知:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

但它实在太慢 - 似乎有大约旋转实际上被解雇的电话和通知之间的第二延迟。 我需要一种可以即时检测设备的方向变化。 我曾尝试与陀螺仪进行实验,但我还没有足够的与它熟悉,知道它是否是我要寻找的解决方案。

Answer 1:

你谈论的是延迟实际上是一个过滤器,以防止错误的(不必要的)方向变化的通知。

对于设备方向的改变即时识别你只是要去有自己监测加速度计。

加速度计测量加速度(重力包括)所有3个轴,所以你不应该搞清楚实际取向的任何问题。

一些代码开始与加速度计的工作可以在这里找到:

如何使一个iPhone应用程序- 5部分:加速度计

而这个不错的博客涵盖了数学部分:

使用加速度计



Answer 2:

添加一个通知在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];
}

我想这是ü可以改变了看法按方位最快



Answer 3:

为什么你didn`t使用

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

或者您可以使用此

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

或这个

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

希望这猫头鹰是有用的)



Answer 4:

对于我的办案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");
    }
}


Answer 5:

在尝试进行更改:

- (void) viewWillLayoutSubviews {}

该代码将在每个方向改变运行作为子视图再次获得布局。



Answer 6:

@vimal答案并没有为我提供解决方案。 看来取向不是当前的方向,但是从前面的方向。 为了解决这个问题,我用[[UIDevice currentDevice] orientation]

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

然后

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

有了这个代码,我得到当前方向的位置。



文章来源: Detecting iOS orientation change instantly