覆盖第三方ViewController的Autorotation属性

时间:2014-06-25 12:18:25

标签: ios objective-c

我正在开发一个使用第三方库的应用程序,该第三方库提供了自己的视图控制器。我可以使用的是.a库和头文件。我的应用程序仅在纵向模式下运行,但是当我将手机设置为横向并从库中显示视图控制器时,应用程序崩溃时出现错误,指出:

“没有支持的方向与应用程序的方向匹配。”

我的猜测是他们写了以下代码:

- (BOOL)shouldAutorotate { 
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

    // ATTENTION! Only return orientation MASK values
    // return UIInterfaceOrientationPortrait;

    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeLeft;
} 

如果是这种情况,我可能需要覆盖这些方法,告诉操作系统不要旋转,只支持肖像。 我该怎么做呢?

我能想到的唯一可能性是为该视图控制器调整方法,但根据一些SO帖子,这似乎是一种危险的方法。

2 个答案:

答案 0 :(得分:2)

您始终可以执行以下操作(作为在纵向模式下锁定ViewController的示例):

1)在应用程序委托头文件中设置属性... @property (nonatomic) BOOL lockScreenPortraitOnly;

2)在应用程序委托实现文件中添加以下方法:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindows:(UIWindow *)window
{
    if (!self.lockScreenPortraitOnly)
        return UIInterfaceOrientationMaskAll;   // or, whatever you wish to support
    else
        return UIInterfaceOrientationMaskPortrait;
}

3)在ViewController中添加以下内容:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    ((EliotsApplicationDelegateType *)[UIApplication sharedApplication].delegate).lockScreenPortraitOnly = YES;
}

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    ((EliotsApplicationDelegateType *)[UIApplication sharedApplication].delegate).lockScreenPortraitOnly = NO;
}

现在,Plist中的内容或第三方图书馆作为"窗口"做什么并不重要。是最根,因此,它控制层次结构中的其他所有内容。显然,在我的示例中,假设您的VC在第三方库代码被调整之前被调用(根据需要调整,调整和烘焙)。

希望这有帮助。

答案 1 :(得分:1)

我说要继续并且调整它。升级库以测试此特定项目时,您需要小心。混合的危险通常伴随着混乱的Apple API,因为它们可以被弃用或者在任何版本中它们的行为都会发生变化(这可能随后会破坏用户的应用程序)。