Iphone iOS 6-(BOOL)应自动旋转导航控制器未被调用

Iphone iOS 6-(BOOL)应自动旋转导航控制器未被调用,iphone,objective-c,ios,xcode,ios6,Iphone,Objective C,Ios,Xcode,Ios6,对于我的应用程序rootViewController是navgationController 我发现 推送控制器 -(BOOL)shouldAutorotate未被调用 及 -(NSUInteger)支持的接口方向仅调用一次 我已在xcode的项目摘要(或plist)中正确检查了windows全方位支持 我希望调用这些方法,因为有一些uicontrol定位代码,我希望以编程方式执行以更改方向 我通过覆盖(类别)导航控制器的以下方法解决了这个问题 -(BOOL)shouldAutorotate;

对于我的应用程序
rootViewController
navgationController

我发现 推送控制器

-(BOOL)shouldAutorotate
未被调用

-(NSUInteger)支持的接口方向
仅调用一次

我已在
xcode的
项目摘要(或
plist
)中正确检查了windows全方位支持

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

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

-(BOOL)shouldAutorotate;

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

(NSUInteger)supportedInterfaceOrientations;

这是很好的工作,但我不认为这是正确的方式。请帮助我找到更好的解决方案。

您可以通过

[UIApplication sharedApplication].statusBarOrientation

加载视图控制器时,例如,在
视图中将出现
。在那里,您可以进行子视图的布局。视图打开后,无论何时打开设备,都会调用
shouldAutorotate

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


请看我的答案:

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

另一种方法是创建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

我在导航控制器上也遇到了同样的问题。它在所有推送视图控制器的情况下都可以正常工作,但我的场景完全不同,我将一个视图控制器作为根推送到导航控制器(ViewControllerParent)中

NavController
            -- rootViewController (ViewControllerParent)
                                          --- ViewControllerChild1
                                          --- ViewControllerChild2
由于一些项目需求,我将ViewControllerParent作为基础,然后根据用户操作将子viewcontroller的视图作为子视图添加到父视图中。现在我有一个场景,我希望Child1不旋转,Child2旋转

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

-(BOOL)shouldAutorotate
{
  BOOL allowRotation = YES;

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

-我也有同样的问题。检查
这是一个很好的方法,而不是应用ShouldAutoRotate

,但是请注意,支持的接口方向只会被调用一次,对不起。我刚刚在一个新项目上测试了这个。无论何时,这两个方法都会被调用一次。在我的例子中(正如我所发布的),我无法处理PresentModalViewController,但pushViewController工作正常不,我正在以正确的方式检查支持接口方向的推送控制器。一切都按预期正常工作。我只是想知道我找到的解决方案(覆盖方法)是否还有其他替代方案,以便推送控制器-(BOOL)应该自动旋转-(整数)支持接口方向;只要方向改变,就会自动呼叫。所以我可以跳过检查哪个控制器被按下,并相应地从覆盖方法调用其UIControl重新定位代码。因为这个UIControl重新定位代码已经存在于控制器定向方法中。这是一个非常有用的帖子。谢谢你