2

我正在开发同时支持纵向方向(纵向和纵向颠倒)的 iPhone 应用程序。

在早期的 XCode4.5.1 中,我通过以下方式解决了这个问题:

  • 在 AppDelegate 中设置 rootViewController
  • 像这样提到 shouldAutorotateToInterfaceOrientation :

    -(BOOL)shouldAutorotateToInterfaceOrientation:    (UIInterfaceOrientation)toInterfaceOrientation {
    
         return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);   }  
    
  • 在 info.plist 文件中提及supportedInterfaceOrientation

现在我正在为较新的 XCode 做同样的事情,但在 iPhone 模拟器 v6.0 中它不支持正确旋转。

我也尝试过这些方法:

-(BOOL) shouldAutorotate {

  BOOL returnValue = NO;

  int interface =  [self preferredInterfaceOrientationForPresentation];

  if(UIInterfaceOrientationIsPortrait(interface)) {

    // Code to handle portrait orientation
    returnValue = YES;
  }
  else {

    // Code to handle Landscape orientation
    returnValue = NO;
  }

  return returnValue;
}

- (NSUInteger) supportedInterfaceOrientations {

  return (UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown);
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
  return (UIInterfaceOrientationPortrait |
          UIInterfaceOrientationPortraitUpsideDown);
}

请指导我如何支持 iOS > 4.3 所有版本的纵向方向。

提前致谢,

4

2 回答 2

1

为什么在 iOS 6 中方向更改为横向停止工作?

从 IOS 6.0 开始,有几个方向更改阻止了我的应用程序从纵向旋转。对我来说,以及适用于此处的解决方法是,您必须setRootViewController在 AppDelegate 的窗口上。较早的答案提供了几个正确的建议,但错过了与我相关的一项。

application didFinishLaunchingWithOptions,之后:

[window makeKeyAndvisible]

或者

[window addSubview: viewController.view];

您必须替换为:

if([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
    [window setRootViewController:viewController];
} else {
    [window addSubview: viewController.view];
    (or [window makeKeyAndvisible])
}

您还需要添加 newshouldAutoRotate而不是 depreciated shouldAutorotateToInterfaceOrientation,但这对我来说更容易找到并且不太重要。

与确保在 .plist 文件中指定所有方向相同。

我不需要覆盖supportedInterfaceOrientations,因为我对默认方向感到满意(全部用于 iPad UIInterfaceOrientationMaskAll,除了倒置用于 iPhone UIInterfaceOrientationMaskAllButUpsideDown)。

于 2013-01-05T18:58:58.507 回答
0

我不得不承认,当 iOS 6 出现时,我一直在摆弄这个,直到我有东西可以工作,然后才停下来。但是,这是我的猜测:

我相信它shouldAutorotate的目的是在您可能想要动态更改您的应用程序是否支持自动旋转的情况下使用。我不认为您打算告诉 iOS您支持哪些方向(如原始shouldAutorotateToInterfaceOrientation:方法)。因此,如果您的应用程序支持任何自动旋转,我认为您应该这样做:

-(BOOL) shouldAutorotate {
   return YES;
}

supportedInterfaceOrientations是您应该确定您支持哪些方向的地方。

但是,在这种方法中,您所做的与我一直在使用的不同(这可能是问题,也可能不是问题)。我认为您应该为此方法使用掩码常量。所以,而不是这个:

- (NSUInteger) supportedInterfaceOrientations {

   return (UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown);
}

用这个:

- (NSUInteger) supportedInterfaceOrientations {

   return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
}

另外,我认为该preferredInterfaceOrientationForPresentation方法不应返回多个方向。 首选可能应该只是一个,例如:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
  return UIInterfaceOrientationPortrait;
}

这是相关的Apple文档

更新:

您可能会尝试的另一件事是使用此方法:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
}

在您的 App Delegate 类中。此方法是可选的,但可以为您的应用程序支持的方向设置默认值,以防您未在所有视图控制器或应用程序plist文件中指定它们。由于您没有显示您的plist文件和其他视图控制器,我无法判断这是否有帮助。但是,这可能是值得尝试的。

于 2012-11-04T09:22:51.083 回答