Browse Source

Merge pull request #40766 from naithar/feature/ios-loading_screen

[4.0] [iOS] Native loading screen implementation
Rémi Verschelde 4 năm trước cách đây
mục cha
commit
6407cdaaf2

+ 8 - 0
platform/iphone/godot_view.h

@@ -32,12 +32,20 @@
 
 class String;
 
+@class GodotView;
 @protocol DisplayLayer;
 @protocol GodotViewRendererProtocol;
 
+@protocol GodotViewDelegate
+
+- (BOOL)godotViewFinishedSetup:(GodotView *)view;
+
+@end
+
 @interface GodotView : UIView
 
 @property(assign, nonatomic) id<GodotViewRendererProtocol> renderer;
+@property(assign, nonatomic) id<GodotViewDelegate> delegate;
 
 @property(assign, readonly, nonatomic) BOOL isActive;
 

+ 9 - 0
platform/iphone/godot_view.mm

@@ -120,6 +120,7 @@ static const int max_touches = 8;
 	[self stopRendering];
 
 	self.renderer = nil;
+	self.delegate = nil;
 
 	if (self.renderingLayer) {
 		[self.renderingLayer removeFromSuperlayer];
@@ -241,6 +242,14 @@ static const int max_touches = 8;
 		return;
 	}
 
+	if (self.delegate) {
+		BOOL delegateFinishedSetup = [self.delegate godotViewFinishedSetup:self];
+
+		if (!delegateFinishedSetup) {
+			return;
+		}
+	}
+
 	[self handleMotion];
 	[self.renderer renderOnView:self];
 }

+ 35 - 1
platform/iphone/view_controller.mm

@@ -40,12 +40,14 @@
 #import <AVFoundation/AVFoundation.h>
 #import <GameController/GameController.h>
 
-@interface ViewController ()
+@interface ViewController () <GodotViewDelegate>
 
 @property(strong, nonatomic) GodotViewRenderer *renderer;
 @property(strong, nonatomic) GodotNativeVideoView *videoView;
 @property(strong, nonatomic) GodotKeyboardInputView *keyboardView;
 
+@property(strong, nonatomic) UIView *godotLoadingOverlay;
+
 @end
 
 @implementation ViewController
@@ -62,6 +64,7 @@
 	self.view = view;
 
 	view.renderer = self.renderer;
+	view.delegate = self;
 }
 
 - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
@@ -97,6 +100,7 @@
 	[super viewDidLoad];
 
 	[self observeKeyboard];
+	[self displayLoadingOverlay];
 
 	if (@available(iOS 11.0, *)) {
 		[self setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
@@ -121,6 +125,31 @@
 				 object:nil];
 }
 
+- (void)displayLoadingOverlay {
+	NSBundle *bundle = [NSBundle mainBundle];
+	NSString *storyboardName = @"Launch Screen";
+
+	if ([bundle pathForResource:storyboardName ofType:@"storyboardc"] == nil) {
+		return;
+	}
+
+	UIStoryboard *launchStoryboard = [UIStoryboard storyboardWithName:storyboardName bundle:bundle];
+
+	UIViewController *controller = [launchStoryboard instantiateInitialViewController];
+	self.godotLoadingOverlay = controller.view;
+	self.godotLoadingOverlay.frame = self.view.bounds;
+	self.godotLoadingOverlay.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+
+	[self.view addSubview:self.godotLoadingOverlay];
+}
+
+- (BOOL)godotViewFinishedSetup:(GodotView *)view {
+	[self.godotLoadingOverlay removeFromSuperview];
+	self.godotLoadingOverlay = nil;
+
+	return YES;
+}
+
 - (void)dealloc {
 	[self.videoView stopVideo];
 
@@ -130,6 +159,11 @@
 
 	self.renderer = nil;
 
+	if (self.godotLoadingOverlay) {
+		[self.godotLoadingOverlay removeFromSuperview];
+		self.godotLoadingOverlay = nil;
+	}
+
 	[[NSNotificationCenter defaultCenter] removeObserver:self];
 }