如何仅在 iOS 15.4.1 上强制某个 viewController 的方向?

How can I force orientation for a certain viewController only for iOS 15.4.1?

提问人:Stéphane Lapointe 提问时间:5/18/2022 更新时间:5/19/2022 访问量:264

问:

我有一个可以在 iPad 和 iPhone 上运行的应用程序。出于 x 原因,我需要对特定 viewController 的方向进行硬编码。我们还能在 ios 15.4.1 上使用 Objective-c 做到这一点吗?我知道这个问题过去曾被问过,但我找不到任何答案,他们在以前的 ios 版本中被问到。

我试过这个:

-(BOOL)shouldAutorotate {
    return YES;
}

-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

而这个:

NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationMaskPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    [UIViewController attemptRotationToDeviceOrientation];

还有更多。到目前为止没有任何效果。

谢谢。

IOS的 Objective-C iPhone Xcode iPad

评论


答:

0赞 Stéphane Lapointe 5/19/2022 #1

我找到了一个解决方法!!一个奇怪的修复,但仍然如此。我不认为这是好方法,也不是那么强大,但它现在有效。

问题是,您无法为Key:@“orientation”设置设备方向 如果设备已处于该位置(该值不会更改)。所以你的视图不会旋转(我 2 美分的猜测是,当值发生变化时,会有一个触发器)。

要解决此问题,您必须以物理方式旋转设备(用户可能不知道这是他必须执行的操作),或者您可以强制更改 forKey:@“orientation” 的值,以便您可以再次更改它,然后设备将旋转。

在这里:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIDeviceOrientation currentDeviceOrientation = [[UIDevice currentDevice] orientation];
    if(currentDeviceOrientation == UIDeviceOrientationPortrait){
        NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    }
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];

我发现它必须在 viewDidLoad 函数中,否则它将无法正常工作。

简单,丑陋,但高效。