我知道您必须为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视图时(注意,我确实推送导航,而不是添加子视图),我只想允许纵向视图。
谁来帮帮我
-更新-更新
我已经创建了我自己的navController子类UINavigationController,我有一个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;
}
}在子视图加载中,我会:
- (void)viewWillAppear:(BOOL)animated{
//get nav controller and turn off landscape mode
JBNavController *navController = (JBNavController*)self.navigationController;
[navController setLandscapeModeOn:NO];
[navController shouldAutorotate];
}他的建议从applefreak中暗示如下:
在您的情况下,一个主要的挑战是不处理方向。实际上,它是将不同的视图控制器锁定到特定的方向
虽然手动旋转视图看起来真的很难没有任何错误,但它似乎是我现在正在尝试的唯一解决方案,将发布更多的一旦解决。
发布于 2012-09-24 22:01:02
以下代码是错误的!
- (BOOL)shouldAutorotate{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}记住,只有当supportedInterfaceOrientations返回YES时,shouldAutoRotate才会被调用。现在,根视图控制器决定是否是子视图旋转。
在您的情况下,我建议将基类控制器设置为self.viewController,并将self.viewController设置为根视图控制器,而不是navigationController,否则将不会调用旋转方法!我遇到了同样的问题。您应该有一个与基本视图控制器和它的子视图的关系。基于活动子类从ShouldAutoRotate返回Yes/No,支持的方向返回相同。如果您遵循这个体系结构,那么它将是一致的复杂应用程序。
例如,在您的示例中,BaseviewController应该从shouldAutoRotate返回YES,当webviewController处于活动状态时,从受支持的方向委托返回UIInterfaceOrientationPortrait。我希望这是合理的。
发布于 2012-09-24 21:47:30
对于您的情况,您必须对NavigationController进行子类化,并将shouldAutorotate和supportedInterfaceOrientations方法添加到其中。iOS6现在以相反的顺序询问您的导航堆栈到iOS5,因此它将首先询问您的NavigationController,如果返回是,它甚至不会与它的子视图控制器进行协商。要解决这样的问题,您必须自己添加逻辑才能做到这一点。
因此,在子类导航控制器中,您手动询问当前的视图控制器,这是自动转换能力:
- (BOOL)shouldAutorotate
{
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}在您的个人视图控制器中,您现在可以实现这些函数,并让它们返回您在问题中定义的值。
我希望这是合理的。
发布于 2012-09-26 13:38:21
iOS5和iOS6的通用代码
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
{
// here to implement landscope code
}
else
{
// here to implement setframePortrait
}
}https://stackoverflow.com/questions/12573317
复制相似问题