Unity游戏在横屏模式下运行,而其他视图控制器则支持所有方向

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window
{
    if ([window rootViewController] == nil)
        return UIInterfaceOrientationMaskAll;

    if (!_unityAppReady)
        return [_rootController supportedInterfaceOrientations];

    UIViewController *gameVc = UnityGetGLViewController();
    // 获取当前显示的视图控制器
    UIViewController *visibleVC = [self getVisibleViewControllerFrom:window.rootViewController];
    if ([visibleVC isKindOfClass:[gameVc class]]) {
        return UIInterfaceOrientationMaskLandscape;
    } else {
        return UIInterfaceOrientationMaskAll;
    }
//    return [[window rootViewController] supportedInterfaceOrientations] | _forceInterfaceOrientationMask;
}

- (UIViewController *)getVisibleViewControllerFrom:(UIViewController *)vc {
    if ([vc isKindOfClass:[UINavigationController class]]) {
        return [self getVisibleViewControllerFrom:[(UINavigationController *)vc visibleViewController]];
    } else if ([vc isKindOfClass:[UITabBarController class]]) {
        return [self getVisibleViewControllerFrom:[(UITabBarController *)vc selectedViewController]];
    } else {
        if (vc.presentedViewController) {
            return [self getVisibleViewControllerFrom:vc.presentedViewController];
        } else {
            return vc;
        }
    }
}

这段代码是Objective-C语言编写的,用于iOS应用开发中,处理应用支持的屏幕方向。它是一个application:supportedInterfaceOrientationsForWindow:方法的实现,这个方法是UIApplicationDelegate协议的一部分,用于决定应用在不同窗口上支持的屏幕方向。

下面是这段代码的逐行解释:

  1. - (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window:这是方法的声明,它告诉编译器这个方法返回一个无符号整数(NSUInteger),并且接收两个参数:一个是UIApplication的实例,另一个是UIWindow的实例。

  2. if ([window rootViewController] == nil):如果窗口的根视图控制器为nil,则直接返回所有方向都支持(UIInterfaceOrientationMaskAll)。

  3. if (!_unityAppReady):如果Unity应用还没有准备好(_unityAppReady是一个布尔值,表示Unity应用是否已经初始化完成),则调用_rootControllersupportedInterfaceOrientations方法来获取支持的方向。

  4. UIViewController *gameVc = UnityGetGLViewController();:获取Unity游戏视图控制器的实例。

  5. UIViewController *visibleVC = [self getVisibleViewControllerFrom:window.rootViewController];:调用getVisibleViewControllerFrom:方法来获取当前显示的视图控制器。

  6. if ([visibleVC isKindOfClass:[gameVc class]]):如果当前显示的视图控制器是游戏视图控制器的实例,则只支持横屏(UIInterfaceOrientationMaskLandscape)。

  7. else { return UIInterfaceOrientationMaskAll; }:如果不是游戏视图控制器,则支持所有方向。

  8. - (UIViewController *)getVisibleViewControllerFrom:(UIViewController *)vc:这是一个辅助方法,用于递归地查找当前显示的视图控制器,无论是在导航控制器、标签页控制器还是模态呈现的视图控制器中。

  9. if ([vc isKindOfClass:[UINavigationController class]]):如果视图控制器是导航控制器的实例,则递归调用该方法以获取可见的视图控制器。

  10. else if ([vc isKindOfClass:[UITabBarController class]]):如果视图控制器是标签页控制器的实例,也进行类似的递归调用。

  11. else { ... }:如果视图控制器是其他类型,检查是否有被呈现的视图控制器,如果有,则递归调用该方法,否则返回当前视图控制器。

这段代码的目的是确保Unity游戏在横屏模式下运行,而其他视图控制器则支持所有方向。这是在iOS应用中常见的模式,特别是在包含游戏或视频播放等全屏内容的应用中。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅墨cgz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值