- (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
协议的一部分,用于决定应用在不同窗口上支持的屏幕方向。
下面是这段代码的逐行解释:
- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window
:这是方法的声明,它告诉编译器这个方法返回一个无符号整数(NSUInteger
),并且接收两个参数:一个是UIApplication
的实例,另一个是UIWindow
的实例。if ([window rootViewController] == nil)
:如果窗口的根视图控制器为nil
,则直接返回所有方向都支持(UIInterfaceOrientationMaskAll
)。if (!_unityAppReady)
:如果Unity应用还没有准备好(_unityAppReady
是一个布尔值,表示Unity应用是否已经初始化完成),则调用_rootController
的supportedInterfaceOrientations
方法来获取支持的方向。UIViewController *gameVc = UnityGetGLViewController();
:获取Unity游戏视图控制器的实例。UIViewController *visibleVC = [self getVisibleViewControllerFrom:window.rootViewController];
:调用getVisibleViewControllerFrom:
方法来获取当前显示的视图控制器。if ([visibleVC isKindOfClass:[gameVc class]])
:如果当前显示的视图控制器是游戏视图控制器的实例,则只支持横屏(UIInterfaceOrientationMaskLandscape
)。else { return UIInterfaceOrientationMaskAll; }
:如果不是游戏视图控制器,则支持所有方向。- (UIViewController *)getVisibleViewControllerFrom:(UIViewController *)vc
:这是一个辅助方法,用于递归地查找当前显示的视图控制器,无论是在导航控制器、标签页控制器还是模态呈现的视图控制器中。if ([vc isKindOfClass:[UINavigationController class]])
:如果视图控制器是导航控制器的实例,则递归调用该方法以获取可见的视图控制器。else if ([vc isKindOfClass:[UITabBarController class]])
:如果视图控制器是标签页控制器的实例,也进行类似的递归调用。else { ... }
:如果视图控制器是其他类型,检查是否有被呈现的视图控制器,如果有,则递归调用该方法,否则返回当前视图控制器。
这段代码的目的是确保Unity游戏在横屏模式下运行,而其他视图控制器则支持所有方向。这是在iOS应用中常见的模式,特别是在包含游戏或视频播放等全屏内容的应用中。