16

我有一个 MainViewController,它有一个通过水平翻转推动新视图(InfoViewController)的按钮。像这样:

controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

MainView 控制器支持 Portrait 和 PortraitUpsideDown。像这样:

- (BOOL)shouldAutorotate {
    return YES;    
}

- (NSUInteger)supportedInterfaceOrientations {    
    return (UIInterfaceOrientationMaskPortrait | 
            UIInterfaceOrientationMaskPortraitUpsideDown);
}

在我的 InfoViewController 中,它还说明了上述代码。在我的 AppDelegate 中,它在 LaunchOptions 中有这个:

[self.window setRootViewController:self.mainViewController];

在我的 app.plist 文件中,它支持所有方向。这是因为其他视图也需要支持横向。所以在我的 MainViewController 和 InfoViewController 上,我只需要 Portrait 和 PortraitUpsideDown。但从另一个角度来看,我需要所有的 orintations。

我的 MainViewController 工作正常,但我的 InfoViewController 适用于所有方向。

我在尝试让它在 iOS6 中工作时遇到了极大的困难。我研究了其他帖子并尝试了其他人提供的帮助,但没有任何运气。请有人能帮我实现这个谢谢。我是一个 Objective-C 新手 :p

4

4 回答 4

26

不支持您的应用 plist 文件中的所有方向,仅支持您的根视图控制器支持的方向。

iOS 6 中的自动旋转正在发生变化。在 iOS 6 中,shouldAutorotateToInterfaceOrientation:不推荐使用 UIViewController 的方法。取而代之的是,您应该使用supportedInterfaceOrientationsForWindow:andshouldAutorotate方法:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}

模态视图控制器在 iOS 6 中不再获得旋转调用:willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:,didRotateFromInterfaceOrientation:方法不再在任何对其自身进行全屏呈现的视图控制器上调用——例如那些被调用的视图控制器:presentViewController:animated:completion:

您可以让呈现模态视图控制器的视图控制器通知它旋转。此外,现在您使用:presentViewController:animated:completion:来呈现视图控制器。presentModalViewController:animated:不推荐使用您在代码中使用的。

于 2012-09-23T18:47:14.410 回答
3

我在使用标签栏控制器时解决了类似的问题。

子类 UITabBarController。实现这些方法:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}


- (BOOL)shouldAutorotate
{
    NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]);

    for (UIViewController *viewController in self.viewControllers) {
        [viewController shouldAutorotate];
    }

    return YES;
}

如果您想在 tabbarcontroller 内的控制器中处理旋转,请在 tab bar 控制器中的每个控制器中也实现这些方法并编写代码来处理方向更改。如果您不想处理它,那么您不需要实现这些方法。TabBarControllers 方法将始终在方向更改时运行。甚至两次,原因不明。

是的,不要忘记删除所有 shouldAutorotate 方法。我完全转向了新的定向模型。如果你想让它们留下来,可能会更难。

于 2012-10-08T00:29:50.110 回答
0

通过继承 UINavigationController 创建一个类别并在 .h 文件中实现以下方法

-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;



 in .m file

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

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

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

并在视图控制器类中实现以下方法,你想启用旋转

-(NSUInteger)supportedInterfaceOrientations
{
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |   UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
 }


- (BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
   return UIInterfaceOrientationLandscapeLeft;
}
于 2014-03-25T05:51:01.723 回答
0

在子类 UITabBarController .m 上添加此代码

@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}
@end

@implementation NameClassUITabBar

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

@end

在这里,我在带有旋转的选项卡栏控制器中发布了我的解决方案/体验:http: //luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html

于 2015-04-16T01:57:52.627 回答