【问题标题】:iOS 6 - Navigation Controller Landscape Rotations For Some Views While Others Portrait OnlyiOS 6 - 某些视图的导航控制器横向旋转,而其他视图仅纵向
【发布时间】:2013-02-06 00:21:48
【问题描述】:

我正在构建一个仅适用于主要视图(正常和倒置)的纵向应用程序。 我已经在项目设置/Plist 中设置了这个设置,一切正常。 但是,我有一些模态视图可以执行显示图像/视频之类的操作,我希望它们能够旋转到所有方向。

我尝试为 UINavigationController 添加一个类别,但没有成功。 我还向调用模态的 viewController 添加了以下代码:

-(BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return NO;
}
-(BOOL)shouldAutomaticallyForwardRotationMethods{
    return NO;
}

我已将以下代码添加到我希望允许所有方向的模态视图控制器中:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

我错过了什么?有什么建议吗?

【问题讨论】:

    标签: ios rotation modal-dialog uiinterfaceorientation


    【解决方案1】:

    在 iOS 6 上,旋转处理发生了变化。对于您描述的问题,有几种方法。首先,在 plist 中,启用除纵向倒置以外的所有方向。

    那么您可以使用以下解决方案之一:

    1. 使用 UINavigationController 的子类,它只允许旋转到纵向。
    2. 为所有控制器指定它们支持的旋转。
    3. 您可以覆盖应用程序委托中的方法。由于每当方向更改或推送新视图控制器时都会在您的委托上调用该方法,因此您可以使用它来临时启用/禁用应用程序的横向显示:

      // In AppDelegate.h:
      @property (nonatomic) BOOL portraitOnly;
      
      // In AppDelegate.m:
      - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
      {
          return _portraitOnly ? UIInterfaceOrientationMaskPortrait : UIInterfaceOrientationMaskAllButUpsideDown;
      }
      
      // to switch to portrait only:
      ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = YES;
      
      // to switch to allowing landscape orientations:
      ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = NO;
      

    【讨论】:

    • 这是个糟糕的主意。应用程序的不同部分将应用程序设置为仅纵向或非纵向可能会导致错误和难以追踪的事情。您应该让该方法返回应用程序在某个时候支持的所有方向,并让每个 VC 实现自己的 -supportedOrientations 方法
    • @JavierSoto 这就是为什么它是我提出的三个解决方案中的第三个的原因。前两个更好。我列出了所有三个,以便问题的作者可以选择最适合手头问题的一个。
    • 如果将 B 推到 A 上,这似乎不起作用,其中 A 是纵向,B 是横向。 UINavigationController 似乎只关心根的方向,因此后续视图控制器不会尊重其首选方向。这是你的经历吗?
    • @Crashalot 据我所知,没有好的方法可以强制导航控制器在推送时改变其方向。我认为当界面在推送时突然旋转时也会非常令人惊讶。
    • @Crashalot 您最终使用了哪种方法我有类似的问题并尝试了很多方法,但没有一个对我有用。只是坚持这个问题。任何帮助将不胜感激。
    【解决方案2】:

    您需要在构建设置中为作为层次结构中祖先的 viewController 启用旋转(以允许层次结构中较低层的 VC 能够根据需要进行旋转)。然后在每个viewController中从shouldAutoRotatesupportedInterfaceOrientationswillAnimateRotationToInterfaceOrientation返回正确的逻辑。

    -从shouldAutoRotate 中返回 NO 来表示完全不动的 viewController。

    -同样,从 shouldAutoRotate 返回 YES 并从 supportedInterfaceOrientations 返回该 VC 中有效的方向

    -使用willAnimateRotationToInterfaceOrientation 在新方向出现之前执行您需要执行的任何最后一分钟清理或数据更改。

    如果您仍有问题,请随时告诉我。希望对您有所帮助!

    【讨论】:

    • 感谢您的帮助。所以我启用了所有方向,然后尝试在我不想旋转到横向的视图中手动设置“supportedInterfaceOrientations”,它们仍然旋转!在那些没有区别的视图中,我也尝试了“shouldAutoRotate”的是/否。
    • -(BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { 返回 UIInterfaceOrientationPortrait; }
    • 把它放在你的视野里,看看它是否旋转。这就是我在一个 vc 不旋转但其他 vc 旋转的项目中使用的确切代码
    • 这就是我已经提出的我不想轮换的观点。它仍然会旋转到所有方向。
    • 即使您在UINavigationController 中执行此操作,这也不会检查您正在推动的控制器支持的新方向,因此在推动 VC 时它不会自行旋转。
    猜你喜欢
    • 2012-09-19
    • 2010-12-30
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2012-12-21
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多