在从横向视图控制器推出时强制使用纵向方向

30

应用程序支持:iOS6+

我的应用程序可以在竖屏和横屏模式下使用,但其中1个控制器只能在竖屏模式下使用。

问题是,当我处于横屏模式并推出该视图控制器时,新的视图控制器也处于横屏模式,直到我将其旋转到竖屏模式。然后它会像应该的那样停留在竖屏模式。

是否有可能始终使它出现在竖屏模式?即使它的父视图正在以横屏模式推送它?

所有下面的代码都没有帮助

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

这段代码有效,直到我尝试从横屏切换过来 如何在iOS 6中强制UIViewController为纵向方向

2个回答

31

我通过在ViewDidLoad方法中添加以下代码解决了这个问题。

UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

1
+1:在视图控制器出现之前,我需要“强制”其方向,这样就行了。希望我知道“官方”的强制方向方法,但在我知道之前,我会使用这种方法。 - brainjam
2
如果您将要多次调用该视图,我建议将这些行添加到viewWillAppear中。 - ChavirA
但是这个API自从iOS6以后就已经被弃用了... :/ - Serzhas
2
当我实施这个解决方案时,它在iPad上无法工作,会出现黑屏。 - Suleman Ilyas
3
有人在iOS 8上找到了解决方案吗?如上所述,这个破解方法已不再可用。苹果难道真的没有任何应对iOS 8的方法吗? - mnemia
显示剩余5条评论

3
首先,您需要创建一个分类:

UINavigationController+Rotation_IOS6.h

#import <UIKit/UIKit.h>

@interface UINavigationController (Rotation_IOS6)

@end

UINavigationController+Rotation_IOS6.m:

#import "UINavigationController+Rotation_IOS6.h"

@implementation UINavigationController (Rotation_IOS6)

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

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

@end

接下来,在你想要仅横向显示的类中实现这些方法:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

如果您正在使用UITabBarController,则只需将UINavigationController替换为UITabBarController即可。在长时间的搜索之后,这个解决方案对我很有效!我曾经和你现在一样处于同样的情况!
编辑
所以,我看到了你的示例。你需要做出一些改变。 1- 为UINavigationController类创建一个新类别。将该类命名为UINavigationController+Rotation_IOS6(.h和.m)。 2- 您不需要实现preferredInterfaceOrientationForPresentation方法。您的类别应该像这样:
#import "UINavigationController+Rotation_IOS6.h"

@implementation UINavigationController (Rotation_IOS6)

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

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

@end

3 - 如果您想在仅横向旋转的情况下旋转类,请在实现中包含以下内容,就像这样:

// Rotation methods for iOS 6
- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

4 - 我建议您在想要横屏的类中,还包括iOS 5的自动旋转方法:

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

我已经尝试了相同的实现,但它没有起作用。我创建了一个示例,请您检查一下?https://github.com/tariq235/ForcePortrait - Tariq
1
嘿,首先感谢您花时间查看我的源代码。由于我需要在强制纵向模式下使用第二个控制器而不是横向模式,因此我将您的MaskLandscape代码更改为MaskPortrait。并且我按照您的指示更新了Github代码,但仍然无法正常工作。我的问题是,如果第一个控制器处于横向模式,然后您单击导航按钮,则第二个控制器不应在横向模式下可见。它应该进行强制纵向旋转。 - Tariq
我已经努力尝试了几天,但还是没有解决问题。我已经尝试了所有可能的方法,但无法找到确切的问题所在。如果你找出了什么,请告诉我。谢谢。 - Tariq
嗯,我解决了...检查一下我的答案...我不确定这是否100%正确,但对我来说是起作用的。 - Tariq
3
实际上,这是一个不应该做的解决方法!但它确实有效!哈哈 - CainaSouza
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接