diff --git a/drivers/apple_embedded/godot_view_controller.mm b/drivers/apple_embedded/godot_view_controller.mm index 0134d718cfc..0bb2ee39b8a 100644 --- a/drivers/apple_embedded/godot_view_controller.mm +++ b/drivers/apple_embedded/godot_view_controller.mm @@ -42,6 +42,7 @@ #import #import +#import @interface GDTViewController () @@ -172,6 +173,9 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.godotView startRendering]; +#ifdef IOS_ENABLED + [self propagateUIPreferencesToRootViewController]; +#endif } - (void)viewDidDisappear:(BOOL)animated { @@ -237,6 +241,35 @@ [[NSNotificationCenter defaultCenter] removeObserver:self]; } +// Propagate UI preferences to the root VC (the SwiftUI hosting controller doesn't delegate these). +#ifdef IOS_ENABLED +- (void)propagateUIPreferencesToRootViewController { + UIViewController *rootVC = self.view.window.rootViewController; + if (!rootVC || rootVC == self) { + return; + } + + Class rootClass = [rootVC class]; + + SEL selectors[] = { + @selector(preferredScreenEdgesDeferringSystemGestures), + @selector(prefersHomeIndicatorAutoHidden), + @selector(prefersStatusBarHidden), + }; + + for (SEL sel : selectors) { + Method method = class_getInstanceMethod([GDTViewController class], sel); + if (!class_addMethod(rootClass, sel, method_getImplementation(method), method_getTypeEncoding(method))) { + method_setImplementation(class_getInstanceMethod(rootClass, sel), method_getImplementation(method)); + } + } + + [rootVC setNeedsUpdateOfScreenEdgesDeferringSystemGestures]; + [rootVC setNeedsUpdateOfHomeIndicatorAutoHidden]; + [rootVC setNeedsStatusBarAppearanceUpdate]; +} +#endif + // MARK: Orientation #ifdef IOS_ENABLED