禁止在iOS 8中为UIModalPresentationCustom modalPresentationStyle旋转

时间:2014-09-15 03:57:48

标签: ios objective-c

我使用它来在iOS 8中呈现clearColor UIViewController:

 self.modalPresentationStyle = UIModalPresentationCustom;
 [_rootViewController presentViewController:self animated:NO completion:nil];

在这个UIViewController中我设置了

- (BOOL)shouldAutorotate
{
  return NO;
}

但我可以在自我呈现时旋转此viewController,当我使用self.modalPresentationStyle =UIModalPresentationCurrentContext时,它不会clearColor但不能旋转。对于UIModalPresentationCustom样式如何禁止旋转?

3 个答案:

答案 0 :(得分:1)

我还试图在iOS 8+中提供一个清晰的颜色UIViewController,选择UIModalPresentationCustom,但未能禁止自动旋转。

对我有用的是使用UIModalPresentationOverFullScreen而自动旋转方法按预期工作:

  

UIModalPresentationOverFullScreen

     
    

视图演示样式     呈现的视图覆盖屏幕。提出的观点     在演示文稿时,不会从视图层次结构中删除内容     饰面。因此,如果呈现的视图控制器没有填满屏幕     对于不透明的内容,基础内容会显示出来。

  
     

适用于iOS 8.0及更高版本。

答案 1 :(得分:0)

我设法通过在我的AppDelegate中的UIViewController上添加此类别来解决此问题。不是最好的解决办法,但到目前为止还没有找到任何有用的东西。

@implementation UIViewController (customModalFix)

- (BOOL)shouldAutorotate
{
    if ([self.presentedViewController isKindOfClass:[MyCustomPortraitOnlyClass class]]) {
        return [self.presentedViewController shouldAutorotate];
    }
    return YES;
}

@end

答案 2 :(得分:0)

我对这个问题迟到了,但是遇到了同样的问题,并找到了解决方案。

方法shouldAutorotate似乎在iOS8中工作不一致(在iOS7中效果很好)。在7和8中完美地为我工作的是supportInterfaceOrientation方法。

我的应用程序中的所有控制器都只是纵向,除了其中一个我以模态方式呈现它(使用UIModalPresentationCustom),并且想要同时支持纵向和横向。我就这样做了:

解决方案

我的应用程序由NavigationController驱动。由于UINavigationController在决定其childControllers如何旋转时获得控制权,因此我将NavigationController子类化并实现了旋转方法:

- (NSUInteger)supportedInterfaceOrientations {
    if (self.topViewController.presentedViewController && ![self.topViewController.presentedViewController isBeingDismissed]) {
        return self.topViewController.presentedViewController.supportedInterfaceOrientations;
    }
    return self.topViewController.supportedInterfaceOrientations;
}

因此该方法查找presentController,如果有一个它检查是否正在被解除,如果是,它将调用转发给topViewController(呈现一个,只允许肖像)。如果没有被解雇(意味着模态在已经呈现之后正在旋转),我将调用转发到允许所有方向的模态。

最后,如果根本没有presentViewController,则将调用转发给topController,在我的情况下,所有这些调用默认返回UIInterfaceOrientationPortrait。

iOS 8问题

8中的问题是,当你有一个模态VC呈现,然后成功旋转到横向,如果你然后将其关闭以返回到只应允许纵向的topController,除非你出现了全屏模式下的模态。为什么?因为iOS 8仅触发在modalPresentationStyle = UIModalPresentationFullScreen时调用supportedInterfaceOrientations的系统方向检查。这在iOS 7中不会发生。

iOS 8 Hack解决方案

您可以在解雇之前手动强制旋转。我把它包装成一个非动画块,以确保用户不必等到屏幕每次从景观中解除模态时都回到画面。我在UIViewController上创建了一个类别来解除模态,它检查操作系统版本并执行8的黑客攻击。这是代码:

 #import "UIViewController+Rotation.h"

@implementation UIViewController (Rotation)
- (void)dismissModalControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        [UIView performWithoutAnimation:^{
            NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
            [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
        }];
    }
    [self dismissViewControllerAnimated:flag completion:completion];
}
@end