iphone - IOS 6强制设备定位到景观




objective-c orientation ios6 (12)

iOS 6发行说明

现在,iOS容器(例如UINavigationController)不会咨询他们的孩子以确定他们是否应该自动旋转。

您的rootViewController是否将ViewController层次结构中的rootViewController消息传递给VC?

我给了一个应用程序说10个视图控制器。 我使用导航控制器来加载/卸载它们。

除一个外,所有人都处于纵向模式。 假设第7个VC在景观中。 我需要它在加载时以横向呈现。

请建议在IOS 6中强制定位从纵向到横向的方法 (在IOS 5中工作也很好)。

以下是我 IOS 6 之前做的事情:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIViewController *c = [[[UIViewController alloc]init] autorelease];
    [self presentModalViewController:c animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

呈现和解雇模态VC迫使应用程序检查其方向,因此应该调用shouldAutorotateToInterfaceOrientation

我在IOS 6中尝试过的内容:

- (BOOL)shouldAutorotate{
    return YES;
}
-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationLandscapeLeft;
}

在加载时,控制器保持纵向。 旋转设备后,方向改变就好了。 但我需要让控制器在加载时自动旋转到横向,因此用户必须旋转设备才能正确查看数据。

另一个问题:在将设备旋转回肖像后,方向转为纵向,尽管我在supportedInterfaceOrientations仅指定了UIInterfaceOrientationMaskLandscape 。 为什么会这样?

此外,以上3种方法中的任何一种都被调用。

一些(有用的)数据:

  1. 在我的plist文件中,我指定了3个方向 - 所有方向都是颠倒的。
  2. 该项目是在Xcode 4.3 IOS 5中启动的。包括xib在内的所有类都是在Xcode 4.5 IOS 6之前创建的,现在我使用的是最后一个版本。
  3. 在plist文件中,状态栏设置为可见。
  4. 在xib文件(我希望在横向中),状态栏为“无”,方向设置为横向。

任何帮助表示赞赏。 谢谢。


作为替代方案,您可以使用块执行相同的操作:

UIViewController *viewController    = [[UIViewController alloc] init];
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:viewController animated:NO completion:^{
    [self dismissViewControllerAnimated:NO completion:nil];
}];

另外,在推送新视图之前调用它。


这应该工作,它类似于iOS 6之前的版本,但使用UINavigationController

UIViewController *portraitViewController = [[UIViewController alloc] init];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController];
[self.navigationController presentModalViewController:nc animated:NO];
[self.navigationController dismissModalViewControllerAnimated:NO];

在我推动下一个UIViewController之前,我正在调用它。 它将强制下一个推送的UIViewController以纵向模式显示,即使当前的UIViewController在Landscape中(也应该适用于Portrait to Landscape)。 适用于iOS 4 + 5 + 6。


我通过继承UINavigationController并覆盖导航控制器的supportedInterfaceOrientations来解决它,如下所示:

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

所有控制器都实现了supportedInterfaceOrientations及其所需的方向。


我使用与OP pre-ios6相同的方法(显示和解除模态VC)以横向模式显示单个视图控制器(所有其他视图控制器)。 它在ios6中打破了风景VC以肖像显示。

为了解决这个问题,我在landscape VC中添加了preferredInterfaceOrientationForPresentation方法。 似乎现在可以在os 5和os 6上正常工作。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

- (BOOL)shouldAutorotate
{
return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{    
return UIInterfaceOrientationLandscapeLeft;
}

嘿伙计们尝试了很多不同的可能的解决方案,没有成功我出来以下的解决方案希望它有所帮助!

我准备了一个食谱:)。

问题:您需要在ios 6中使用navigationcontroller更改viewcontrollers的方向。

解:

步骤1.一个初始UIviewcontroler触发模态segues到横向和纵向UInavigationControllers如图所示....

在UIViewController1中我们需要根据Appdelegate的全局变量进行2次segues动作....

-(void)viewDidAppear:(BOOL)animated{
    if([globalDelegate changeOrientation]==0){
        [self performSegueWithIdentifier:@"p" sender:self];
    }
    else{
        [self performSegueWithIdentifier:@"l" sender:self];
    }

}

我们还需要回到肖像和| 景观....

- (IBAction)dimis:(id)sender {
    [globalDelegate setChangeOrientation:0];
    [self dismissViewControllerAnimated:NO completion:nil];
}

第2步。每个NavigationController的第一个Pushing UiViewControllers都配有......

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

-(BOOL)shouldAutorotate{
    return YES;
}

第3步。我们在UInavigationController的子类中覆盖supportedInterfaceOrientations方法....

在你的customNavigationController我们有.....

-(NSUInteger)supportedInterfaceOrientations{
    if([self.visibleViewController isKindOfClass:[ViewController2 class]]){

        return UIInterfaceOrientationMaskPortrait;
    }
    else{
        return UIInterfaceOrientationMaskLandscape;

    }

}

步骤4.在storyboard或代码中,将wantsFullScreenLayout标志设置为yes,同时设置为纵向和横向uinavigationcontrollers。


我有同样的问题,在我的应用程序中有27个视图,其中26个是纵向的,只有一个在所有方向(图像查看器:))。 在每个类上添加宏并替换导航不是我觉得舒服的解决方案...

所以,我想在我的应用程序中保留UINavigationController机制,而不是用其他代码替换它。

该怎么办:

@ 1在方法didFinishLaunchingWithOptions中的应用程序委托中

if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
    // how the view was configured before IOS6
    [self.window addSubview: navigationController.view];
    [self.window makeKeyAndVisible];
}
else
{
    // this is the code that will start the interface to rotate once again
    [self.window setRootViewController: self.navigationController];
}

@ 2因为navigationController只响应YES以进行自转,我们需要添加一些限制:扩展UINavicationController - > YourNavigationController并将其链接到Interface Builder中。

@ 3从导航控制器覆盖“anoying new methods”。

由于此类仅适用于此应用程序,因此它可以对其控制器负责并在其位置进行响应。

-(BOOL)shouldAutorotate {

    if ([self.viewControllers firstObject] == YourObject)
    {
         return YES;
    }
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
     if ([self.viewControllers firstObject] == YourObject)
    {
         return UIINterfaceOrientationMaskLandscape;
    }
    return UIInterfaceOrientationMaskPortrait;
}

我希望这能帮到您,


我有同样的问题。 如果要强制特定视图控制器以横向显示,请在将其推入导航堆栈之前执行此操作。

UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        if (currentOrientation == UIInterfaceOrientationPortrait ||
            currentOrientation == UIInterfaceOrientationPortraitUpsideDown)
            [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft];

        UIViewController *vc = [[UIViewController alloc] init];
        [self.navigationController pushViewController:vc animated:YES];
        [vc release];

尝试segueing到UINavigationController ,它使用一个类别或子类来指定所需的方向,然后转到所需的VC。 here阅读更多。


我认为最好的解决方案是坚持官方的苹果文档。 所以根据我使用以下方法,一切都在iOS 5和6上运行良好。在我的VC中,我覆盖以下方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

iOS 6的方法,第一种方法返回支持的方向掩码(如其名称所示)

-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskPortrait;
}

第二个,它告诉你的VC哪个是VC显示时首选的界面方向。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

只需更改您想要的方向肖像;)此解决方案工作顺利,我不喜欢创建宏和其他东西的想法,这就是这个简单的解决方案。 希望这有帮助......


转到Info.plist文件并进行更改


Jared使用通用容器视图控制器解决方法对我没有好运。 我已经使用supportedInterfaceOrientations对tab bar控制器进行了子类化,但也没有运气。 无论启动后6+的方向如何,标签栏的窗口都是报告frame = (0 0; 736 414)

到目前为止,我发现的唯一解决方法是在makeKeyAndVisible之后强制窗口框架

[self.window makeKeyAndVisible]; self.window.frame = CGRectMake(0, 0, MIN(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)), MAX(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)));





iphone objective-c orientation ios6