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



Answers

这应该工作,它类似于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。

Question

我给了一个应用程序说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文件(我希望在横向中),状态栏为“无”,方向设置为横向。

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




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




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

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

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




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




我使用与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;
}



我有同样的问题,在我的应用程序中有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;
}

我希望这能帮到您,




Related