支持iOS 6.0中针对不同视图控制器的不同方向

时间:2012-10-17 06:44:29

标签: objective-c ios6 uiinterfaceorientation

我的应用程序中有自定义拆分视图控制器,带有主控制器和详细控制器。

- (id)initWithMasterController:(UIViewController*)aMasterController
            detailedController:(UIViewController*)aDetailedController;

为主控制器和细节控制器提供的控制器是UINavigationController。

作为我的应用程序的一部分,有两种可能的方向处理案例:

  1. 当在主控制器和细节控制器中使用六个控制器组合时,应用程序支持所有方向。
  2. 仅在详细信息控制器上有StudentDetailsViewController时,只能支持两种可能的方向。 (风景)
  3. 当设备的方向发生变化时,iOS 6.0以下版本中会发生以下情况

    1. 调用-shouldAutorotateToInterfaceOrientation:方法。该方法的实现如下:在运行时,我将请求转发给主控制器并使用相同的调用详细说明控制器。

      - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
      {   
          BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation]
                     && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
          return res;
      }
      
    2. masterController的-shouldAutorotateToInterfaceOrientation将返回TRUE。 StudentViewController中方法的实现如下。

      - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
      {
          return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation)
                           : UIInterfaceOrientationIsPortrait(interfaceOrientation);
      }
      
    3. 获取有关要更改的新方向的信息的能力有助于我决定是否应该启用旋转。

      使用iOS 6.0:

      当设备的方向发生变化时,iOS 6.0版本中会发生以下情况

      1. 调用拆分视图控制器的方法-shouldAutorotate。它的实现在

        之下
        - (BOOL)shouldAutorotate {
            BOOL res = [masterController shouldAutorotate]
                       && [detailedController shouldAutorotate];
            return res;
         }
        
      2. detailedController的shouldAutorotate调用navigationController。在StudentsController中实现autorotate功能:

        - (BOOL)shouldAutorotate {
            return YES;
        }
        
        - (NSUInteger)supportedInterfaceOrientations {
            return (UIInterfaceOrientationMaskLandscapeLeft
                    | UIInterfaceOrientationMaskLandscapeRight);
        }
        
      3. 但是对于iOS 6.0,我无法控制方向。即使调用supportedInterfaceOrientations方法,当调用StudentsDetailsController的shouldAutorotate方法时,来自detailsController的shouldAutorotate方法,shouldAutorotateMethod也不遵守supportedInterfaceOrientations方法中提到的选项。

        更新

        我阅读了文档,以下注释在document中提供。

          

        有时您可能想要动态禁用自动旋转。对于   例如,您可以在要抑制旋转时执行此操作   完全在短时间内。你必须暂时禁用   方向改变你想手动控制的位置   状态栏(例如当你打电话给   setStatusBarOrientation:animated:method)。

             

        如果要暂时禁用自动旋转,请避免   操纵方向掩码来做到这一点。相反,覆盖   最顶层视图控制器上的shouldAutorotate方法。这个方法是   在执行任何自动旋转之前调用。如果它返回NO,那么   旋转被抑制。

        是否可以根据当前方向暂时禁用自动旋转?

2 个答案:

答案 0 :(得分:0)

我相信这是iOS中的某种类型的问题,其中rootViewController不会查询childViewController的首选方向。但是,您应该尝试以下内容:

 if (self.interfaceOrientation != UIInterfaceOrientationPortrait) 
{
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait];
}

将给定视图的方向更改回肖像。

答案 1 :(得分:0)

在你的应用程序委托类中定义以下方法,在应用程序中的任何其他旋转方法之前调用此方法。

创建一个标志(isRotationEnabled),用于决定应用的方向。

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {    

return self.isRotationEnabled ?
    UIInterfaceOrientationMaskAll :
    UIInterfaceOrientationMaskPortrait;
}

使用以下代码

根据您应用中的不同条件更改此标记
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.isRotationEnabled = NO;