【问题标题】:iOS 6 - (BOOL)shouldAutorotate not getting called for navigation controllers pushed viewControllersiOS 6 - (BOOL)shouldAutorotate 不被调用导航控制器推送视图控制器
【发布时间】:2012-10-01 10:10:08
【问题描述】:

对于我的应用,rootViewControllernavgationController

我发现 推送控制器的

-(BOOL)shouldAutorotate 没有被调用。

-(NSUInteger)supportedInterfaceOrientations 只被调用一次。

我已在 xcode's 项目摘要(或 plist)中正确检查了 windows 所有方向支持。

我希望调用这些方法,因为我想以编程方式执行一些 uicontrol 定位代码以更改方向。

我通过覆盖(类别)导航控制器的以下方法解决了这个问题

-(BOOL)shouldAutorotate;

-(NSUInteger)supportedInterfaceOrientations;

我检查了哪个控制器被推送,并在导航控制器的以下方法中相应地调用了相应的推送控制器的 uicontrol 定位代码

(NSUInteger)supportedInterfaceOrientations;

这很好,但我认为这不是正确的方法。请帮助我寻求更好的解决方案。

【问题讨论】:

标签: iphone objective-c ios xcode ios6


【解决方案1】:

您可以查看以下链接,您需要创建自定义导航以支持自动旋转

http://mobileappdevpage.blogspot.in/2012/11/how-to-use-should-autorotateios-6-with.html

另一种方法是创建 UINaviagationController 类别

.h 文件的代码是

@interface UINavigationController (autorotation)

-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;

.m 文件的代码是

@implementation UINavigationController (autorotation)

-(BOOL)shouldAutorotate
{

    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
    [self.topViewController shouldAutorotate];
    return YES;

}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;

}
@end

【讨论】:

  • 这对我来说非常有用。谢谢你
【解决方案2】:

导航控制器也遇到了同样的问题。它适用于所有推送的视图控制器,但我的情况完全不同,我将一个视图控制器作为根推送到导航控制器 (ViewControllerParent),

NavController
            -- rootViewController (ViewControllerParent)
                                          --- ViewControllerChild1
                                          --- ViewControllerChild2

由于某些项目要求,我将 ViewControllerParent 作为基础,然后根据用户操作将子视图控制器的视图作为子视图添加到父视图。现在我有一个场景,我希望 Child1 不旋转,而 Child2 旋转。

我面临的问题是导航控制器类中的 [self.topViewController] 总是返回父对象,因为我没有将孩子推入导航堆栈。所以我的 Childs 中的 shouldAutorotate 方法永远不会被调用。所以我不得不在我父母的 shouldAutorotate 方法中进行类检查,然后返回旋转值。 我在父类(ViewControllerParent)中做了类似的事情,这是一种解决方法,但它解决了问题

-(BOOL)shouldAutorotate
{
  BOOL allowRotation = YES;

   if ([currentlyLoadedChild isKindOfClass:[Child1 class]])
   {
       allowRotation = NO;
   }
   if ([currentlyLoadedChild isKindOfClass:[Child2 class]])
   {
       allowRotation = YES;
   }
   return allowRotation;
} 

-anoop

【讨论】:

    【解决方案3】:

    您可以通过

    检查界面方向
    [UIApplication sharedApplication].statusBarOrientation
    

    当视图控制器被加载时,比如说,viewWillAppear。在那里你可以做你的子视图布局。视图打开后,只要设备转动,shouldAutorotate 就会被调用。

    【讨论】:

    • 但请注意,您支持的InterfaceOrientations 只会被调用一次
    • 不,抱歉。我刚刚在一个新项目上对此进行了测试。每当我转身时,这两种方法都会被调用一次。
    【解决方案4】:

    覆盖 UINavigationController 是正确的方法,但我不确定您是否以正确的方式检查了支持的推送控制器。

    在这里看我的回答:https://stackoverflow.com/a/12669343/253008

    【讨论】:

    • 不,我正在以正确的方式检查支持的推送控制器。一切都按预期正常工作。我只是想知道我找到的解决方案(覆盖方法)是否有其他替代方案,以便推送控制器 -(BOOL)shouldAutorotate; -(NSUInteger)支持的接口方向;每当方向改变时都会自动调用。所以我可以跳过检查哪个控制器被推送并相应地从重写方法调用它的 UIControl 重新定位代码。由于这个 UIControl 重新定位代码已经存在于控制器方向方法中。
    【解决方案5】:

    我遇到了同样的问题。检查this answer 这是一个很好的方法,而不是应用 ShouldAutoRotate

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多