2012-09-24 216 views
5

我知道你必须使用IOS6的新旋转方法,但似乎我写的方法不起作用。IOS6旋转问题

我设置好的我的plist文件,允许所有旋转,但不portraitUpsideDown

然后我在我的的appDelegate如下:

self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
[self.window setRootViewController:navController]; //add nav controller to be the root view 

然后在我的rootView,推到另一个控制器,我有:

WebViewViewController *webController = [[JBWebViewViewController alloc] init]; 
webController.urlString = urlName; 
[self.navigationController pushViewController:webController animated:YES]; 

而在网络控制器我哈哈五个:

#pragma mark - System Rotation Methods 
//for any version before 6.0 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
//only allow landscape 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

/for 6.0+ 
- (BOOL)shouldAutorotate{ 
return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
return UIInterfaceOrientationMaskPortrait; 
} 

我想要做的,是让根视图3度旋转,但是当切换到Web视图(注意我做俯卧撑的导航,而不是增加子视图),我只想让纵向视图。

有人帮我请

------- UPDATE ----------

我创建的UINavigationController我自己navController子类中,我有一个BOOL landscapeModeOn那我可以设置要告诉自动旋转功能

#pragma mark - System Rotation Methods 
//for any version before 6.0 
- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation 
{ 
    if (landscapeModeOn) { 
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
    } else { 
    return interfaceOrientation == UIInterfaceOrientationPortrait; 
    } 
} 

//for 6.0+ 
- (NSUInteger)supportedInterfaceOrientations{ 
    if (landscapeModeOn) { 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
    } else { 
    return UIInterfaceOrientationMaskPortrait; 
    } 
} 

- (BOOL)shouldAutorotate{ 
    UIInterfaceOrientation ori = [UIDevice currentDevice].orientation; 
    if (landscapeModeOn) { 
    return ori != UIInterfaceOrientationPortraitUpsideDown; 
    } else { 
    return ori == UIInterfaceOrientationPortrait; 
    } 
} 

IN子视图加载,我做的:

- (void)viewWillAppear:(BOOL)animated{ 
    //get nav controller and turn off landscape mode 
    JBNavController *navController = (JBNavController*)self.navigationController; 
    [navController setLandscapeModeOn:NO]; 
    [navController shouldAutorotate]; 
} 

--------------------请参阅最佳答案的报价 对于IOS6,苹果现在专注于将Storyboard的AutoLayout与新的旋转定义一起使用,因此很难修复基础上的iOS 4.3和iOS 5的编码结构

从applefreak为iOS6的一些微小的错误,他的建议暗示的:

你的情况的一个主要挑战是不处理的方向。其实它的锁定不同的视图控制器,以特定的方向

虽然手动旋转的观点似乎真的很难,没有任何错误的事,但现在看来,我想唯一的解决办法,将发布更多一旦解决

+0

根据rooster117的答案通用的代码,这是我的解决方案:http://stackoverflow.com/questions/12662240/how-to-make-app-fully-工薪正确地换自转式-IOS-6/12662433#12662433] [1] [1]:http://stackoverflow.com/questions/12662240/how-to-make-app - 完全性工作,正确地换自转功能于IOS-12662433分之6#12662433 – Carina

回答

2

下面的代码是错误的!

- (BOOL)shouldAutorotate{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

请记住,只有当shouldAutoRotate返回YES时,supportedInterfaceOrientations才会被调用。现在,根视图控制器决定它是否是儿童旋转或不旋转。

在你的情况我建议有一个基类控制器,您self.viewController并设置self.viewController到根视图控制器不navigationController否则旋转方法将不会被调用!我遇到了同样的问题。您应该与基本视图控制器建立HAS-A关系,并且它是子级。 ShouldAutoRotate基于活动的孩子返回Yes/No,支持方向相同。如果你遵循这个架构,那么对于复杂的应用程序来说,它是一致的

例如,你的情况应该BaseviewController从是从shouldAutoRotate支撑定向委托返回,返回时UIInterfaceOrientationPortrait是webviewController活跃。我希望这是有道理的。

+0

欢呼,但它决策意识。但是,它似乎完全不影响结果,我仍然可以旋转到横向模式。 – phil88530

+0

它不应该你可以把NSLog放在shouldAutoRotate中,看看它是否被调用!我有同样的问题,以前的编码器使用UINavigationController。我不得不将其更改为我的CustomViewController作为根视图控制器和方法开始调用,旋转开始按预期工作。我只支持肖像模式,但只有一些屏幕在景观模式下旋转。 – applefreak

+0

我做了我自己的navController类,并且对于每个视图,我根据是否仅需要视图肖像来设置导航控制器。有用。但是,当我第一次加载视图时,它不检查它。我手动调用[navController shouldAutoRotate [当视图加载,并且我NSLog它,它被调用,但视图不旋转(例如根视图横向进入第二个仅肖像视图,视图在横向旋转,并不旋转,但如果我将它画像,它会旋转回来,然后如果我再次将其横向放置,它将不会旋转) – phil88530

6

对于你将不得不继承你的NavigationController的子类并添加shouldAutorotate和supportedInterfaceOrientations方法。 iOS6现在要求您的导航堆栈以与iOS5相反的顺序,因此它会首先询问您的NavigationController,如果返回YES,它甚至不会咨询它的子视图控制器。为了解决这个问题,你必须添加逻辑自己做这个

所以在您的子类的导航控制器手动问你的当前视图 - 控制它的自转能力:

- (BOOL)shouldAutorotate 
{ 
    return self.topViewController.shouldAutorotate; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.topViewController.supportedInterfaceOrientations; 
} 

,并在您的个人viewcontrollers你现在可以实现的函数并让它们返回您在问题中定义的值。

我希望这是有道理的。

+0

嘿:我有我的webViewController:UINavigationController的,并已实现你的方法,但是当我点击按钮,RU n:self.navigationController pushViewController:webViewController,它(lldb)并死亡 – phil88530

+0

我会确保你的子类的所有实现都是正确的。如果您使用IB,请确保导航控制器是正确的类,如果您手动分配它,请确保您在alloc中使用了所有正确的关键字。我会认为它有什么问题。如果没有,你会得到任何帮助输出? – rooster117

+0

如果你回到我的问题,我在的appDelegate导航控制器ALLOC,然后只需在根视图navigationController推,这是所有的地方,我受够了。你觉得我会做一些修改吗?我只得到了(LLDB),无其他错误消息 – phil88530

0

它的iOS5和iOS6的

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     // here to implement landscope code 
    } 

    else 
    { 
     // here to implement setframePortrait 
    } 
} 
+0

他使用替代(bool)autorotateToInterfaceOrientation,它在iOS6中被弃用 – Comradsky