我使用它来在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样式如何禁止旋转?
答案 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。
8中的问题是,当你有一个模态VC呈现,然后成功旋转到横向,如果你然后将其关闭以返回到只应允许纵向的topController,除非你出现了全屏模式下的模态。为什么?因为iOS 8仅触发在modalPresentationStyle = UIModalPresentationFullScreen时调用supportedInterfaceOrientations的系统方向检查。这在iOS 7中不会发生。
您可以在解雇之前手动强制旋转。我把它包装成一个非动画块,以确保用户不必等到屏幕每次从景观中解除模态时都回到画面。我在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