在iOS7中处理一个视图控制器的自动旋转

dji*_*i33 9 iphone objective-c rotation ios ios7

我已经阅读了很多关于SO的答案,但我似乎无法在iOS7上进行自动旋转.

我只需要一个视图控制器来旋转,所以我不想在我的Info.plist中设置旋转设置.

据我了解Apple的文档,单个视图控制器可以通过简单地覆盖两个方法来覆盖全局旋转设置(来自Info.plist).Info.plist设置为仅允许Portrait,我的视图控制器实现以下方法:

- (NSUInteger)supportedInterfaceOrientations
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (BOOL)shouldAutorotate
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我在旋转时看到那些NSLog语句但没有旋转.

如果我使用正确的旋转设置配置Info.plist,我的视图将旋转,但如果我尝试依赖我的视图控制器则不会.

不确定它是否重要,但我试图旋转的视图来自使用自动布局的.xib.

此外,我的ViewController以模态方式呈现,并包含在导航控制器中.我试过单独呈现视图控制器,但这不起作用.我也尝试在UINavigationController中添加一个类别,以便从它的topViewController获取它的自动旋转方向.

Nat*_*ink 17

就我而言,我有一个新的iOS7应用程序,已经创建了大约30个视图控制器.我只需要在一个模态视图控制器上进行自动旋转.我不想更新预先存在的视图控制器.

我在plist中选择了我想要的方向:

选择方向

然后我在UIViewController上为我的app委托添加了一个类别:

@implementation UIViewController (rotate)
   -(BOOL)shouldAutorotate {
      return NO;
   }
@end
Run Code Online (Sandbox Code Playgroud)

然后在单模态视图控制器中我想要旋转我添加了这个方法:

-(BOOL)shouldAutorotate {
      return YES;
}
Run Code Online (Sandbox Code Playgroud)

我还发现,如果我的视图控制器不是模态VC,我需要在UINavigationController上添加类别方法,对于根视图控制器之后的所有VC,作为视图控制器的导航堆栈的一部分 - 类似于这个:https://stackoverflow.com/a/20283331/396429

  • 您不应该使用类别来覆盖方法.完全相同的干净方法是为所有UIViewControllers创建一个基类并覆盖那里的方法. (5认同)
  • @Nate,你的答案的重点是不正确的,类别不能用于此,因为你的情况是特定的,当它工作.当您使用类别覆盖方法时,无法保证它实际上会覆盖它,它仍然可以选择旧方法. (3认同)

Ala*_*977 16

简单,但它工作得很好.IOS 7.1和8

AppDelegate.h

@property () BOOL restrictRotation;
Run Code Online (Sandbox Code Playgroud)

AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
    return UIInterfaceOrientationMaskPortrait;
else
    return UIInterfaceOrientationMaskAll;
}
Run Code Online (Sandbox Code Playgroud)

视图控制器

-(void) restrictRotation:(BOOL) restriction
{
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = restriction;
}
Run Code Online (Sandbox Code Playgroud)

viewDidLoad中

[self restrictRotation:YES]; or NO
Run Code Online (Sandbox Code Playgroud)


Dav*_*d H 7

您需要将plist值设置为所有可能的值,然后根据需要限制它们(在Navigation Controllers和TabBar控制器中.来自UIViewController类描述:

在iOS 6及更高版本中,您的应用程序支持应用程序的Info.plist文件中定义的界面方向.视图控制器可以覆盖supportedInterfaceOrientations方法以限制支持的方向列表.通常,系统仅在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕; 子视图控制器使用由父视图控制器为其提供的窗口部分,不再直接参与有关支持哪些旋转的决策.应用程序的方向遮罩和视图控制器的方向遮罩的交点用于确定视图控制器可以旋转到哪个方向.