UIViewController接口方向错误

时间:2014-08-11 12:28:05

标签: ios objective-c uiviewcontroller uiinterfaceorientation

UIViewController旋转方法中,我在执行设备旋转时遇到问题

方法内部

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

我的值不正确

根据文件:

  

在用户界面开始之前发送到视图控制器   旋转。子类可以重写此方法以执行其他操作   轮换前的行动。例如,您可以使用   此方法可禁用视图交互,停止媒体播放或   暂时关闭昂贵的绘图或实时更新。你也可以   用它来交换当前视图以反映新视图   界面方向。 调用此方法时,   interfaceOrientation属性仍包含视图的原始属性   方向。 您对此方法的实现必须调用super   在执行期间的某些方面。无论如何调用此方法   您的代码是执行一步还是两步旋转。

我正在设备竖起(启动应用程序后,设备处于纵向模式) - 所有视图都正确对齐纵向模式

但是在方法中我得到了错误的值:

    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
    // getting the wrong interface orientation here!!!!
   // just checking the current orientation for debug
        UIInterfaceOrientation currentOrientation = self.interfaceOrientation;
   // the first time the device is rotated getting this value for current orientation:
        // currentOrientation == UIInterfaceOrientationLandscapeRight
    }

甚至比这种错误方向的奇怪情况更糟糕的是,在“将旋转到界面方向”的同一方法中,当前界面方向和目标界面方向是相同的,即:

self.interfaceOrientation === toInterfaceOrientation

那么这个方法的重点是框架???

这导致我的所有UIView放置代码在设备初始旋转时无法正确计算。

为什么这个标志设置不正确?!?!

P.S

第二次旋转设备后 - 标记设置正确,视图“正确”对齐。

1 个答案:

答案 0 :(得分:0)

你会得到正确的值,假设你在端口仪式中持有设备,然后你把它转为横向模式,然后这个方法叫做

//首先调用

 -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
  {
      //check which orientation hear   
      if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
       {
             NSLog(@"turning t landscape");
       }
      else
       {
             NSLog(@"turning t portrite");
       }
  }

listen toInterfaceOrientation方法包含(对于我们的示例)UIInterfaceOrientationLandscapeRight or UIInterfaceOrientationLandscapeLeft`,这表示设备将转向横向左侧或仪式

之后,下面按顺序调用

 - (void)viewWillLayoutSubviews  

 - (void)willAnimateRotationToInterfaceOrientation:duration:

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

被叫,听到最后一个方法fromInterfaceOrientation包含(对于我们的示例)旧值或以前的方向标记,即UIInterfaceOrientationPortraitUpsideDownUIInterfaceOrientationPortrait

你想知道当前的方向,然后你可以使用

 UIInterfaceOrientation  orientation = [[UIApplication sharedApplication] statusBarOrientation];
  if(UIInterfaceOrientationIsLandscape(orientation))
  {
    NSLog(@"landscape");
  }
  else
  {
    NSLog(@"portrite");
  }

有关此内容的详情,请参阅此docs