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

发布于:2024-07-01 ⋅ 阅读:(43) ⋅ 点赞:(0)
- (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应用中常见的模式,特别是在包含游戏或视频播放等全屏内容的应用中。


网站公告

今日签到

点亮在社区的每一天
去签到