【问题标题】:iOS8 iOS7 and iOS6 prevent rotation of modally presented view controlleriOS8 iOS7 和 iOS6 防止模态呈现视图控制器的旋转
【发布时间】:2014-11-09 16:45:04
【问题描述】:

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

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

【问题讨论】:

    标签: ios7 ios6 ios8 screen-rotation presentviewcontroller


    【解决方案1】:

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

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

    @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
    

    编辑(添加替代解决方案)

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

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

    @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
    

    【讨论】:

    • 那行不通,因为我需要视图控制器在另一个视图控制器之上清晰,以实现模糊视图。不要认为它在嵌入导航控制器时会起作用。
    • 如果您不需要像我一样看穿您的模态框,这很有效。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多