Objective c 在屏幕旋转iOS 6上真的卡住了,我需要一个锁定到纵向的xib

Objective c 在屏幕旋转iOS 6上真的卡住了,我需要一个锁定到纵向的xib,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,在这里阅读了IOS 6中处理屏幕旋转的每一种方法、苹果文档和激烈的谷歌搜索之后,在使用xibs的几天之后,我仍然停留在这一点上 我想要实现的是,只有几个iPad的XIB,只有横向的,应用程序的其余部分是纵向的 如果我使用的是故事板,我知道如何对导航控制器进行子类化以覆盖旋转,但我不是,我使用的是xibs,希望您能提供任何关于如何使用xibs的信息 在我的应用程序代理中: ICHomeController *homeController = [[ICHomeController alloc] in

在这里阅读了IOS 6中处理屏幕旋转的每一种方法、苹果文档和激烈的谷歌搜索之后,在使用xibs的几天之后,我仍然停留在这一点上

我想要实现的是,只有几个iPad的XIB,只有横向的,应用程序的其余部分是纵向的

如果我使用的是故事板,我知道如何对导航控制器进行子类化以覆盖旋转,但我不是,我使用的是xibs,希望您能提供任何关于如何使用xibs的信息

在我的应用程序代理中:

ICHomeController *homeController = [[ICHomeController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:homeController];
navController.navigationBarHidden = YES;
navController.navigationBar.barStyle = UIBarStyleBlackOpaque;
navController.navigationBar.tintColor = [UIColor grayColor];
self.navigationController = navController;
[self.window setRootViewController:self.navigationController];
[self.window makeKeyAndVisible];
return YES;
除了尝试这里的每个解决方案之外,我还在我的vew控制器中尝试了显而易见的解决方案,但据我所知,在iOS 6中它没有被调用

// Older versions of iOS (deprecated)
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}


 - (BOOL)shouldAutorotate {
return YES;
 }


 - (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
 }


 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft;
}

我已经用一个更复杂的导航结构和它斗争了好几天了

基本规则似乎是根控制器(无论是UINavigationController、uitabarcontroller还是简单的UIViewController)控制旋转。因此,当您将UIViewController推到堆栈上时,第一个控制器仍然控制旋转

如果使用模态视图,则此模型视图将被视为堆栈的根视图,直到它被取消。因此,如果显示模态UIViewController,然后将视图推到其顶部,则显示为模态视图的UIViewController将控制旋转。 只需确保模态视图使用presentViewController:animated:completion

要使某些视图处于不同的旋转状态,最简单的方法是以模态方式呈现。 如果无法避免,请直接返回到第一个视图或nag控制器并设置旋转

添加一些
NSLog(@“%s”,函数)语句添加到旋转方法中,以查看正在调用哪些方法

在上面的代码中,只有第一个方法是旧的iOS5(现在已弃用)方法。其他3种是新的iOS 6方法

使用上面的示例代码,您需要为UINavigationController创建子类。为此,创建一个新类作为UINavigationController子类,使用不同的名称,例如MyNavigationController,并向其添加旋转方法。然后在上面的代码中,而不是使用
UINavigationController*navController=[[UINavigationController alloc]initWithRootViewController:homeController]

您可以使用:

MyNavigationController*navController=[[MyNavigationController alloc]initWithRootViewController:homeController]

此外,请确保您允许在此处选择方向:
我也有同样的问题。以下是我在第五和第六节中的表现

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {

    return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0)
{
    return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0) {
    return UIInterfaceOrientationLandscapeLeft;
}

就目标摘要而言,只有纵向模式是“受支持的”。

没有调用任何内容。我在过程的早期添加了日志,我支持iOS 5和iOS 6,因此不推荐的方法仍然存在。这个应用程序很复杂,不是我的代码,真的无法解决这个问题。我使用我的根视图控制器作为其在堆栈上的推送,我根本无法得到这些方法的任何确认。虽然我在原则上理解得很透彻,可以在故事板上做到这一点,但与XIB合作只是没有它。谢谢更新答案,让我试试看…你的viewController不是根,navController是根。因此,导航控制器必须进行子类化,以使旋转正常工作。这是有道理的,现在,由于您的建议(加上1),我再次许可了我的导航控制器,但仍然没有获得屏幕旋转,必须有一个比这更简单的方法!您是否已将NSLog放入以查看是否在子类nav控制器中调用了这些方法?此外,在您的代码中有以下内容
self.navigationController=navController;[self.windowsetRootViewController:self.navigationController]当然应该是
window.rootViewController=navController