iOS8、iOS7和iOS6防止模态呈现的视图控制器的旋转



我有几个视图控制器,它们是使用presentViewController:animated:方法模式化呈现的。我不想让应用程序在iPad上演示时旋转,因为使用FXBlurView时它们都有模糊的背景,旋转起来很麻烦,而且有时旋转演示的视图会弄乱演示的视图。

我需要支持iOS6、7和8,除了私有的API setOrientation:方法之外,找不到任何解决方案。

我找到的唯一解决方案是创建一个导航控制器子类,并在该导航控制器中包含模态视图控制器
这意味着您必须呈现导航控制器,该控制器将具有您最初想要呈现的根视图控制器。

以下是非旋转(纵向)导航控制器的示例实现:

@implementation NonRotatingNavigationController
- (BOOL)shouldAutorotate {
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}
@end

您也可以"询问"显示的视图控制器,而不是决定支持哪个方向
像这样:

@implementation NonRotatingNavigationController
- (BOOL)shouldAutorotate {
    return [[[self viewControllers] lastObject] shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
    return [[[self viewControllers] lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [[[self viewControllers] lastObject] preferredInterfaceOrientationForPresentation];
}
@end

EDIT(添加了一个替代解决方案)

另一种解决方案是添加一个单独的窗口,该窗口将包含视图控制器
这一次,您必须在视图控制器本身内部实现旋转方法,并将其设置为新窗口的根视图控制器。

以下是窗口创建代码(重要的是,窗口将由某人拥有,例如原始视图控制器中的强属性,否则它将被释放,您将什么都看不到):

@interface ViewController ()
@property (nonatomic, strong) UIWindow *modalWindow;
@end
@implementation ViewController
- (IBAction)buttonTapped:(id)sender {
    NonRotatingViewController *vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"NonRotatingViewController"];
    UIWindow *modalWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame];
    modalWindow.windowLevel = UIWindowLevelAlert;
    modalWindow.backgroundColor = [UIColor clearColor];
    [modalWindow setRootViewController:vc];
    [modalWindow makeKeyAndVisible];
    self.modalWindow = modalWindow;
}
@end

最新更新