Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在iOS6中,在堆栈上按时,将ViewController强制到某些接口方向时出现问题_Iphone_Ios_Cocoa Touch_Uiviewcontroller - Fatal编程技术网

Iphone 在iOS6中,在堆栈上按时,将ViewController强制到某些接口方向时出现问题

Iphone 在iOS6中,在堆栈上按时,将ViewController强制到某些接口方向时出现问题,iphone,ios,cocoa-touch,uiviewcontroller,Iphone,Ios,Cocoa Touch,Uiviewcontroller,我已设置以下视图控制器: viewController1可以自由旋转到除纵向倒置以外的任何方向 viewController2被推到viewController1的顶部,我希望它的方向与viewController1相同,并且我希望它不能旋转 viewController3被推到viewController2的顶部。我希望viewController3处于纵向模式 我在iOS6中尝试实现这一点时遇到了很多问题(在iOS5中还没有尝试过)。首先,我已经创建了自己的导航控制器,并将以下内容放入其中:

我已设置以下视图控制器:

viewController1可以自由旋转到除纵向倒置以外的任何方向

viewController2被推到viewController1的顶部,我希望它的方向与viewController1相同,并且我希望它不能旋转

viewController3被推到viewController2的顶部。我希望viewController3处于纵向模式

我在iOS6中尝试实现这一点时遇到了很多问题(在iOS5中还没有尝试过)。首先,我已经创建了自己的导航控制器,并将以下内容放入其中:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

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

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

我尝试了很多不同的组合来了解这些东西。如果vc2是横向的,我的主要困难是迫使vc3以纵向的形式呈现。任何帮助都将不胜感激。

您在这里试图做的是与框架抗争。您所描述的并不是iOS 6中导航控制器体系结构的工作原理。如果要显示视图控制器的视图并强制旋转,请使用显示的视图控制器。这是唯一有意义的时间
preferredInterfaceOrientationForPresentation
,并且您的视图控制器的
受支持的InterfaceOrientations
实际上会被查询,因为在显示时,它将位于接口的根

我在另一个回答中解释说,在iOS 6中,将新的视图控制器推到导航控制器上时,不支持强制旋转。您可以构建关于补偿旋转的规则(即,如果用户旋转设备会发生什么),但不能强制界面旋转。iOS 6乐于让您强制旋转的唯一情况是在显示或取消视图控制器时(
presentViewController:animated:
dismissViewControllerAnimated:

但是,可以使用显示的视图控制器,使其看起来像是在推导航控制器。我拍了一部电影,展示了我的意思:

无论如何,这都不是完美的。状态栏没有旋转动画,两个视图之间有一种黑色的“闪烁”——这是故意的,因为它是用来掩盖真实情况的。实际情况是,有两个不同的导航控制器和三个视图控制器,如故事板的屏幕截图所示

我们所拥有的是:

  • 设置为纵向的导航控制器子类及其根视图控制器

  • 第二个导航控制器子类设置为横向,其根视图控制器为黑色,用作中间层

  • 第三视图控制器被推到第二导航控制器的堆栈上

当用户要求从第一个视图控制器“前进”时,我们将显示第二个导航控制器,从而立即看到黑色视图控制器,但随后我们立即按下第三个视图控制器。所以我们得到了强制旋转,还有一种黑色闪光和一个推送动画。当用户点击第三视图控制器中的“后退”按钮时,我们将反转该过程

所有过渡代码都在黑色视图控制器(ViewControllerIntermediary)中。我尝试调整它,以提供我能提供的最令人满意的动画:

@implementation ViewControllerIntermediary {
    BOOL _comingBack;
}

- (void) viewDidLoad {
    [super viewDidLoad];
    self.navigationController.delegate = self;
}

-(void)navigationController:(UINavigationController *)nc 
        willShowViewController:(UIViewController *)vc 
        animated:(BOOL)anim {
    if (self == vc)
        [nc setNavigationBarHidden:YES animated:_comingBack];
    else
        [nc setNavigationBarHidden:NO animated:YES];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (!_comingBack) {
        [self performSegueWithIdentifier:@"pushme" sender:self];
        _comingBack = YES;
    }
    else
        [self.navigationController dismissViewControllerAnimated:YES 
            completion:nil];
}
斯威夫特呢

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int {

    if self.window?.rootViewController?.presentedViewController? is SecondViewController {

        let secondController = self.window!.rootViewController.presentedViewController as SecondViewController

        if secondController.isPresented {
            return Int(UIInterfaceOrientationMask.All.toRaw());
        } else {
            return Int(UIInterfaceOrientationMask.Portrait.toRaw());
        }
    } else {
        return Int(UIInterfaceOrientationMask.Portrait.toRaw());
    }

}

有关更多详细信息,请检查此

,您的意思是我必须将其作为一个modalview来推动以强制其旋转吗?我不能将它推到导航堆栈上并强制它?是的,没错,除了你说的方式:你必须将它表示为以前称为模态视图控制器的东西,而不是推到导航堆栈上。显示的视图控制器可以强制旋转。推到导航堆栈上的视图控制器不能;当用户旋转设备时,应用程序可以动态决定如何响应,但仅仅将视图控制器推到导航堆栈上的动作不会导致应用程序界面旋转。您是否知道是否有手动方法在视图控制器显示后强制其旋转?就像不是用户让它旋转,而是让它自己旋转?你只是让我重复我自己的话。不,没有。如果用户旋转设备,并且应用程序、应用程序代理和根视图控制器支持,则框架将以补偿方式旋转应用程序;它将强制应用程序旋转,以响应显示的视图控制器。否则它将一事无成。简直太棒了。有人能把这个链接放到官方的解释上吗?我为此奋斗了太久。
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int {

    if self.window?.rootViewController?.presentedViewController? is SecondViewController {

        let secondController = self.window!.rootViewController.presentedViewController as SecondViewController

        if secondController.isPresented {
            return Int(UIInterfaceOrientationMask.All.toRaw());
        } else {
            return Int(UIInterfaceOrientationMask.Portrait.toRaw());
        }
    } else {
        return Int(UIInterfaceOrientationMask.Portrait.toRaw());
    }

}