在iOS 7上为单个呈现的ViewController禁用自动旋转

Sal*_*uts 8 cocoa-touch objective-c uiviewcontroller ios

我有一个UIViewController,模态显示(全屏),我想在该视图中禁用自动旋转.我不想将它限制为横向或纵向,只是希望它保持在最初呈现的任何方向.

在iOS 6上,只需覆盖该方法就足够了:

- (BOOL)shouldAutorotate {
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

它完全符合我的要求.然而,在iOS 7上,这似乎没有任何效果.该方法确实被调用,但操作系统似乎忽略了返回值 - 无论如何都会自动旋转.

该文档未提及此方法的任何更改.如何在iOS 7上实现预期效果?

编辑:视图控制器正在显示(未按下!)UINavigationViewController:

[self.navigationController presentViewController:vc animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

解:

虽然看起来很奇怪,但是这个解决方案并没有在关于这个主题的众多现有问题中发表.在iOS 7上,似乎UINavigationController给出 的答案shouldAutorotate是操作系统的作用.我们需要子类UINavigationController来修改它的行为.

处理常规导航堆栈时,确实只需使用即可[self.topViewController shouldAutorotate],但是当存在模态视图时,它就位于self.presentedViewController,而不是self.topViewController.因此,完整的解决方案如下:

- (BOOL)shouldAutorotate {
    UIViewController *vc;
    if (self.presentedViewController) vc = self.presentedViewController;
    else vc = [self topViewController];
    return [vc shouldAutorotate];
}
Run Code Online (Sandbox Code Playgroud)

Cra*_*ens 5

所以我只是尝试了你的代码并且它起作用,这使我相信你正在展示你UIViewController的代码UINavigationController.无论出于何种原因,iOS 7改变了UINavigationController处理旋转的方式.

最简单的解决方案是创建一个子类UINavigationController来覆盖该shouldAutorotate方法并从topViewController返回值.

@interface CustomNavigationController : UINavigationController

@end

@implementation CustomNavigationController

- (BOOL)shouldAutorotate
{
    return [[self topViewController] shouldAutorotate];
}

@end
Run Code Online (Sandbox Code Playgroud)

因此,与其这样,当viewController是你的对象返回NOshouldAutorotate.

UINavigaitonController *navController = [UINavigationController alloc] initWithRootViewController:viewController];
[self presentViewController:navController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

您将使用CustomNavigationController

CustomNavigationController *customNavController = [CustomNavigationController alloc] initWithRootViewController:viewController];
[self presentViewController:customNavController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)


use*_*236 -1

#import <objc/message.h>

-(void)viewDidAppear:(BOOL)animated{             

    objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );

 }
Run Code Online (Sandbox Code Playgroud)

请参阅如何在 iOS7 中以编程方式设置设备方向?

但假设您使用此方法,因为它是私有 API,您的应用程序可能会被 Apple 拒绝。因此,也许最好从“项目详细信息”->“常规”->“部署信息”选项卡设置方向,仅选择“横向左”和“横向右”选项。如果您的所有观点只需要一种方向,这可能是一个更好的方法。