【问题标题】:IOS6 rotation issueIOS6轮换问题
【发布时间】:2012-09-16 09:38:45
【问题描述】:

我知道你必须使用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 视图时(注意我是推送导航,而不是添加子视图),我只想允许纵向视图。

请大家帮帮我

-------更新---------

我已经创建了自己的 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;
  }
}

在加载子视图时,我会这样做:

- (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的编码结构,IOS6的一些小bug很难修复

来自 applefreak,他的建议暗示:

在您的案例中,一个主要挑战是不处理方向。实际上它将不同的视图控制器锁定到特定的方向

虽然手动旋转视图似乎真的很难做到没有任何错误,但它似乎是我现在正在尝试的唯一解决方案,一旦解决就会发布更多

【问题讨论】:

标签: iphone ios uinavigationcontroller rotation ios6


【解决方案1】:

根据您的情况,您必须将 NavigationController 子类化并添加 shouldAutorotate 和 supportedInterfaceOrientations 方法。 iOS6 现在以与 iOS5 相反的顺序询问您的导航堆栈,因此它会首先询问您的 NavigationController,如果返回 YES,它甚至不会咨询它的子视图控制器。要解决这个问题,您必须自己添加逻辑来执行此操作

因此,在您的子类导航控制器中,您手动询问当前视图控制器它的自动旋转能力:

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

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

在您的个人视图控制器中,您现在可以实现这些功能并让它们返回您在问题中定义的所需值。

我希望这是有道理的。

【讨论】:

  • 嘿:我有我的 webViewController:UINavigationController,并实现了你的方法,但是当我单击按钮运行时:self.navigationController pushViewController:webViewController,它(lldb)死了
  • 我会确保你在子类化时所有的实现都是正确的。如果您使用的是 IB,请确保导航控制器属于正确的类,并且如果您手动分配它,请确保您在 alloc 中使用了所有正确的关键字。我会认为它有问题。如果没有,您对输出有任何帮助吗?
  • 如果你回到我的问题,我在 appDelegate 中有导航控制器 alloc,然后只需在根视图中推送 navigationController,这就是我拥有的所有地方。你认为我会做一些修改吗?我只有一个(lldb),没有其他错误消息
  • 其实我得到了:不支持推送导航控制器
【解决方案2】:

以下代码错误!

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

请记住,supportedInterfaceOrientations 仅在 shouldAutoRotate 返回 YES 时才会被调用。现在根视图控制器决定它的孩子是否旋转。

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

例如,在您的情况下,当 webviewController 处于活动状态时,BaseviewController 应该从 shouldAutoRotate 返回 YES 并从支持的方向委托返回 UIInterfaceOrientationPortrait。我希望这是有道理的。

【讨论】:

  • 干杯,这确实有道理。但是,它似乎根本不影响结果,我仍然可以旋转到横向模式。
  • 你不应该把 NSLog 放在 shouldAutoRotate 中看看它是否被调用!我有同样的问题,以前的编码器正在使用 UINavigationController。我不得不将它更改为我的 CustomViewController,因为根视图控制器和方法开始被调用,并且旋转开始按预期工作。我只支持纵向模式,但只有部分屏幕在横向模式下旋转。
  • 我做了自己的 navController 类,对于每个视图,我都根据我是否只想要视图肖像来设置导航控制器。有用。但是,当我第一次加载视图时,它不会检查它。我在视图加载时手动调用了 [navController shouldAutoRotate[,并且我 NSLog 它被调用,但视图不旋转(例如,根视图横向进入第二个仅纵向视图,视图以横向旋转并且不旋转回来,但是如果我纵向它,它会旋转回来,然后如果我再次横向它,它就不会旋转)
  • 第一次加载时,您必须先旋转状态栏,然后才能呈现孩子。确切的问题是我只希望我的图表屏幕处于横向模式,但它在第一次加载时是纵向的。所以我使用 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapLeft] 并且效果很好。我 99% 肯定你也有同样的问题!基本思想是您必须在呈现视图控制器之前将状态栏设置为适当的方向,并在关闭视图控制器时重置状态栏。
  • 真是个好主意!但是,它似乎旋转状态栏,而不是视图?所以我的视图仍在旋转,但状态栏现在是纵向的(因为我将它设置为旋转为纵向)。然后因为我只允许该方向,现在我根本无法旋转以使该景观视图旋转回来,即使是纵向...
【解决方案3】:

iOS5和iOS6通用代码

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

    else
    {  
        // here to  implement setframePortrait
    }
}

【讨论】:

  • 他正在使用 (bool)autorotateToInterfaceOrientation 的替代品,它在 iOS6 中已被弃用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多