9

我已经阅读了很多关于 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;
}

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

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

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

此外,我的 ViewController 以模态方式呈现并包含在导航控制器中。我试过只展示视图控制器本身,但这是行不通的。我还尝试向 UINavigationController 添加一个类别,以从它的 topViewController 获取它的自动旋转方向。

4

5 回答 5

17

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

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

选择方向

然后我在 UIViewController 上为我的应用程序委托添加了一个类别:

@implementation UIViewController (rotate)
   -(BOOL)shouldAutorotate {
      return NO;
   }
@end

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

-(BOOL)shouldAutorotate {
      return YES;
}

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

于 2014-03-09T19:54:35.813 回答
16

很简单,但效果很好。IOS 7.1 和 8

AppDelegate.h

@property () BOOL restrictRotation;

AppDelegate.m

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

视图控制器

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

viewDidLoad

[self restrictRotation:YES]; or NO
于 2014-09-20T19:41:05.977 回答
7

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

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

于 2013-10-21T18:58:53.723 回答
1

我遇到过这样的问题 - 我的应用程序中只有一个横向视图。我用下面的代码来处理这个问题。

#import "objc/message.h"
-(void)viewWillAppear:(BOOL)animated{

objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft);
}
于 2014-08-22T09:39:09.880 回答
0

我知道这已经过时了,但我最终遇到了一个更独特的情况,我们在整个应用程序中拥有 50 多个 ViewController,我拒绝通过这些 ViewController 来修改和支持所有这些中的相同方向,但只有一个或 2 个。这让我我的答案。我创建了一个 UIViewController 类别,它覆盖 - (BOOL)shouldAutorotate 根据设备类型等始终返回 NO 或 YES(这也可以通过支持的界面方向来完成)。然后在 ViewControllers 上我想支持更多而不仅仅是肖像,我调整了 shouldAutorotate 以返回 YES。然后在父 ViewControllers viewWillAppear 方法上关闭视图时强制更改方向,使用:

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"].

一切都说完了,我在几个 ViewController 上完成了我想要的一切,代码少于 30 行,使用宏进行调配。如果我通过替换应用程序中所有 VC 上的 shouldAutorotate 和 supportedInterfaceOrientations 来完成它,我将有大约 250 行额外的代码。并且首先添加了很多繁重的工作。

于 2015-02-13T21:28:44.690 回答