首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS6旋转问题

IOS6旋转问题
EN

Stack Overflow用户
提问于 2012-09-24 21:39:46
回答 3查看 7.8K关注 0票数 5

我知道您必须为IOS6使用新的旋转方法,但我编写的方法似乎不起作用。

我设置了plist文件以允许所有旋转,但不允许,而不是portraitUpsideDown

然后,在我的appDelegate中有以下内容

代码语言:javascript
复制
self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
[self.window setRootViewController:navController];  //add nav controller to be the root view

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

代码语言:javascript
复制
WebViewViewController *webController = [[JBWebViewViewController alloc] init];
webController.urlString =   urlName;
[self.navigationController pushViewController:webController animated:YES];

在网络控制器中,我有:

代码语言:javascript
复制
#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,可以设置它来告诉自动旋转规范

代码语言:javascript
复制
#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;
  }
}

在子视图加载中,我会:

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

他的建议从applefreak中暗示如下:

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-24 22:01:02

以下代码是错误的!

代码语言:javascript
复制
- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

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

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

例如,在您的示例中,BaseviewController应该从shouldAutoRotate返回YES,当webviewController处于活动状态时,从受支持的方向委托返回UIInterfaceOrientationPortrait。我希望这是合理的。

票数 2
EN

Stack Overflow用户

发布于 2012-09-24 21:47:30

对于您的情况,您必须对NavigationController进行子类化,并将shouldAutorotate和supportedInterfaceOrientations方法添加到其中。iOS6现在以相反的顺序询问您的导航堆栈到iOS5,因此它将首先询问您的NavigationController,如果返回是,它甚至不会与它的子视图控制器进行协商。要解决这样的问题,您必须自己添加逻辑才能做到这一点。

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

代码语言:javascript
复制
- (BOOL)shouldAutorotate
{
    return self.topViewController.shouldAutorotate;
}

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

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

我希望这是合理的。

票数 6
EN

Stack Overflow用户

发布于 2012-09-26 13:38:21

iOS5和iOS6的通用代码

代码语言:javascript
复制
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation))  
    { 
        // here to  implement landscope code
    }

    else
    {  
        // here to  implement setframePortrait
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12573317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档