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

时间:2013-10-21 18:44:09

标签: iphone ios objective-c rotation 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;
}

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

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

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

此外,我的ViewController以模态方式呈现,并包含在导航控制器中。我试过单独呈现视图控制器,但这不起作用。我也试过adding a category to UINavigationController从它的topViewController获取它的自动旋转方向。

5 个答案:

答案 0 :(得分:17)

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

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

select orientations

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

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

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

-(BOOL)shouldAutorotate {
      return YES;
}

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

答案 1 :(得分: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;
}

的ViewController

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

viewDidLoad中

[self restrictRotation:YES]; or NO

答案 2 :(得分:7)

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

  

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

答案 3 :(得分:1)

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

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

objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft);
}

答案 4 :(得分:0)

我知道这已经过时了但我最终处于一个更独特的情况,我们在整个应用程序中都有50多个ViewController我拒绝通过修改并支持相同的方向,但只有一个或两个。带我回答我的问题。我创建了一个覆盖的UIViewController类别 - (BOOL)shouldAutorotate总是返回NO或YES,具体取决于设备类型等(这也可以通过支持的接口方向完成)。然后在ViewControllers上我想支持更多然后只是肖像,我调到shouldAutorotate返回YES。然后在使用以下方法在父ViewControllers viewWillAppear方法中关闭视图时强制方向更改:

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

完成所有操作后,我在一些ViewControllers上用<完成了我想要的一切。使用宏进行调配的30行代码。如果我通过在应用程序中的所有VC上替换shouldAutorotate和supportedInterfaceOrientations来完成它,我将有大约250行代码。并且首先添加了许多笨拙的工作。