0

我目前在应用商店中有一个几乎只有横向的 iPad 应用程序,并且在处理旋转锁定方面遇到了一些新的 iOS 6 方式的问题。

它是一个基于 UINavigationController 的应用程序,并且由于 iOS 承担了大部分责任,rootViewController因此UIWindow我必须手动询问每个 UIViewController 它想要什么旋转。

因为我有大量UIViewController的手动向每个控制器添加代码来执行此操作会花费我很长时间,所以我对 UINavigationController 和 UIViewController 进行了扩展以覆盖这些调用,并且我可以手动设置我想要的视图阻止肖像和什么允许它。

UINavigationController-Extension.m:

//
//  UINavigationController-Extension.m
//  DrivingInstructor
//
//  Created by Liam Nichols on 06/12/2012.
//  Copyright (c) 2012 Liam Nichols. All rights reserved.
//

#import "UINavigationController-Extension.h"


@implementation UINavigationController (Extension)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

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

-(BOOL)shouldAutorotate
{
    return YES;
}

@end


@implementation UIViewController (Extension)

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
    {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
    {
        return YES;
    }
    return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

-(NSArray*)portraitClasses
{
    static NSArray *classes;
    if (classes == nil)
    {
        classes = @[ @"MockTestController", @"PLUILibraryViewController", @"PhotoViewController" ];
    }
    return classes;
}

@end

一开始我认为这已经解决了这个问题(我还在 info.plist 中将应用程序锁定为横向,以便它启动到横向,然后在应用程序委托中我调用application:supportedInterfaceOrientationsForWindow:并返回所有方向,以便我的选择视图可以访问纵向如果需要的话。

所以这似乎奏效了,所有锁定到 lanscape 的视图控制器都接受我在扩展类中指定的 3。我正在监视扩展,每当我推到新控制器时,它都会检查方向并将应用程序锁定到指定方向。

然而,我发现但似乎无法解决的一个问题是,例如,当我在允许的视图控制器上处于纵向状态并尝试弹回前一个视图控制器时,锁定为横向supportedInterfaceOrientations的内容不再被调用,并且视图应该锁定到横向的不是(这会导致问题)。

根据苹果文件,这是它应该如何工作的,因为处理旋转的责任被传递给了 rootViewController,并且由于用户没有旋转他们的设备并且 rootViewController 没有改变,所以不需要请求supportedInterfaceOrientations..

我的问题是,有没有办法让应用程序强制调用supportedInterfaceOrientations或者我应该以不同的方式执行此操作?

感谢阅读,如果我能找到最后一个错误的解决方案,那么这段代码可能是对同样情况的人的一个很好的参考。

- - -编辑 - - -

正在做一些进一步的调查,发现就在viewWillAppear:函数之前,supportedInterfaceOrientations实际上实际上是在我试图弹回的控制器上调用的,并且确实返回了正确的掩码UIInterfaceOrientationMaskLandscape以尝试使其自动从纵向旋转回来,但它似乎没有听这个回应,仍然留下UIViewController肖像......

所以这意味着我不需要supportedInterfaceOrientations再次调用,而是让设备旋转回横向!

4

1 回答 1

0

根据文档,您可以致电:

+ (void)attemptRotationToDeviceOrientation

如果我正确理解了文档,那么它将再次查询旋转到不同的视图控制器。

于 2012-12-12T15:11:15.237 回答