// Copyright © 2018 650 Industries. All rights reserved. #import #import #import @interface EXSplashScreenViewController () @property (nonatomic, weak) UIView *rootView; @property (nonatomic, assign) BOOL autoHideEnabled; @property (nonatomic, assign) BOOL splashScreenShown; @property (nonatomic, assign) BOOL appContentAppeared; @end @implementation EXSplashScreenViewController - (instancetype)initWithRootView:(UIView *)rootView splashScreenView:(nonnull UIView *)splashScreenView { if (self = [super init]) { _rootView = rootView; _autoHideEnabled = YES; _splashScreenShown = NO; _appContentAppeared = NO; _splashScreenView = splashScreenView; } return self; } # pragma mark public methods - (void)showWithCallback:(void (^)(void))successCallback failureCallback:(void (^)(NSString * _Nonnull))failureCallback { [self showWithCallback:successCallback]; } - (void)showWithCallback:(nullable void(^)(void))successCallback { [EXUtilities performSynchronouslyOnMainThread:^{ UIView *rootView = self.rootView; self.splashScreenView.frame = rootView.bounds; [rootView addSubview:self.splashScreenView]; self.splashScreenShown = YES; if (successCallback) { successCallback(); } }]; } - (void)preventAutoHideWithCallback:(void (^)(BOOL))successCallback failureCallback:(void (^)(NSString * _Nonnull))failureCallback { if (!_autoHideEnabled) { return successCallback(NO); } _autoHideEnabled = NO; successCallback(YES); } - (void)hideWithCallback:(void (^)(BOOL))successCallback failureCallback:(void (^)(NSString * _Nonnull))failureCallback { if (!_splashScreenShown) { return successCallback(NO); } [self hideWithCallback:successCallback]; } - (void)hideWithCallback:(nullable void(^)(BOOL))successCallback { EX_WEAKIFY(self); dispatch_async(dispatch_get_main_queue(), ^{ EX_ENSURE_STRONGIFY(self); [self.splashScreenView removeFromSuperview]; self.splashScreenShown = NO; self.autoHideEnabled = YES; if (successCallback) { successCallback(YES); } }); } - (BOOL)needsHideOnAppContentDidAppear { if (!_appContentAppeared && _autoHideEnabled) { _appContentAppeared = YES; return YES; } return NO; } - (BOOL)needsShowOnAppContentWillReload { if (!_appContentAppeared) { _autoHideEnabled = YES; _appContentAppeared = NO; return YES; } return NO; } @end