4

我认为这个问题现在应该已经被问了一百万次了,但我仍然找不到答案。

这是我的层次结构: UINavigationController -> UIViewController 1 ->(push)-> UIViewController 2

UINavigationController:支持所有可能的方向 UIViewController 1:仅支持纵向 UIViewController 2:仅支持横向

如何将 UIViewController 1 锁定为纵向,同时将 UIViewController 2 锁定为横向?甚至可能吗?到目前为止,我看到的是 UIViewController 2 始终采用 UIViewController 1 的方向。

请注意,这仅适用于 iOS 6。

谢谢!

4

3 回答 3

13

我也发现了同样的问题。我发现 shouldAutorotate 函数不是每次都调用所以我改变方向编程

首先导入这个

#import <objc/message.h>

然后

-(void)viewDidAppear:(BOOL)animated
{

     if(UIDeviceOrientationIsPortrait(self.interfaceOrientation)){
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
        {
            objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft );


        }
    }

}

希望这对你有帮助。

于 2013-05-04T05:24:39.237 回答
9

添加新的 Objective-C 类(UINavigationController 的子类)并将以下代码添加到 .m 文件中

-(NSUInteger)supportedInterfaceOrientations
 {
     NSLog(@"supportedInterfaceOrientations = %d ", [self.topViewController         supportedInterfaceOrientations]);

     return [self.topViewController supportedInterfaceOrientations];
 }

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

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  {
    // You do not need this method if you are not supporting earlier iOS Versions

    return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
  }

添加新类后,转到您的 ViewController 类并进行以下更改

- (BOOL)shouldAutorotate  // iOS 6 autorotation fix
  {
    return YES;
  }
- (NSUInteger)supportedInterfaceOrientations // iOS 6 autorotation fix
  {
      return UIInterfaceOrientationMaskAll;
  }

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation // iOS 6 autorotation fix
  {
      return UIInterfaceOrientationPortrait;
  }
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
  {
      return YES;
  }

在此处输入图像描述

在 shouldAutorotate 中, shouldAutorotateToInterfaceOrientation: 如果您希望 ViewController 支持多方向则返回 YES ,否则返回 NO ,同样在 houldAutorotateToInterfaceOrientation: 方法中为特定 ViewController 传递您想要的 Orintation ,对所有视图控制器重复相同的操作。

这样做的原因:-

1:虽然您可以将任何viewController 的preferredInterfaceOrientationForPresentation: 更改为特定方向,但是由于您使用的是UINavigationController,您还需要为您的UINavigationController 覆盖supportedInterfaceOrientations

2:为了覆盖 UINavigationController 的 supportedInterfaceOrientations,我们将 UINavigationController 子类化并修改了与 UINavigation Orientation 相关的方法。

希望它会帮助你!

于 2013-05-04T05:17:38.663 回答
1

使应用只支持纵向模式,并在 UIViewController 2 的 initWithNibName 中添加以下行

self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
于 2013-05-04T15:30:32.817 回答