Mostrar la pantalla de bienvenida cada vez que la aplicación se active

Quiero que se muestre la pantalla de bienvenida cada vez que la aplicación se active. He creado una function showSplash que showSplash en applicationDidBecomeActive:

 -(void)showSplash { UIImageView *splashScreen = [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"Default.png"]]; [self.window.rootViewController.view addSubview: splashScreen]; [self.window makeKeyAndVisible]; NSLog(@"begin splash"); [UIView animateWithDuration: 4.2 delay: 0.5 options: UIViewAnimationOptionCurveEaseOut animations: ^{ splashScreen.alpha = 0.0; } completion: ^ (BOOL finished) { [splashScreen removeFromSuperview]; NSLog(@"end splash"); } ]; } 

Así es como llamo a esta function:

 - (void)applicationDidBecomeActive:(UIApplication *)application { [self showSplash]; } 

Pero no aparece ninguna pantalla de bienvenida. Por favor corrigeme.

después de agregar la vista de salpicadura – tráigalo al frente

cambio

 UIImageView *splashScreen = [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"Default.png"]]; [self.window.rootViewController.view addSubview: splashScreen]; [self.window makeKeyAndVisible]; 

a

 UIImageView *splashScreen = [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"Default.png"]]; [self.window addSubview: splashScreen]; [self.window bringSubviewToFront: splashScreen]; //! [self.window makeKeyAndVisible]; 

Si desea que la aplicación tenga un nuevo comienzo cada vez que vuelva a hacerlo, también podría deshabilitar la ejecución de background, como se indica en la Documentación de Apple (última sección titulada "Optar por no ejecutar en segundo plano"):

Si no desea que su aplicación se ejecute en segundo plano, puede dejar de background explícitamente al agregar la key UIApplicationExitsOnSuspend (con el valor YES) al file Info.plist de su aplicación.

Asegúrate de que la vista principal del controller de vista raíz de la window sea la vista más alta de la aplicación en el momento en que quieras mostrar la bienvenida …

Compruebe el marco de splashScreen (UIImageView). Establezca su marco en los límites de su controller de vista raíz.

Puede intentar cazar el controller de vista superior con una recursión como esta:

 - (UIViewController *)findTopViewController { return [self topViewControllerFrom:self.window.rootViewController]; } - (UIViewController *)topViewControllerFrom:(UIViewController *)vc { if (vc.navigationController.visibleViewController != nil) { return [self topViewControllerFrom:vc.navigationController.visibleViewController]; } if (vc.tabBarController.selectedViewController != nil) { return [self topViewControllerFrom:vc.tabBarController.selectedViewController]; } return vc; } 

Ahora, llamar a [self findTopViewController] debería devolver el VC actualmente visible / superior de tu aplicación, y puedes hacer lo siguiente:

 [[self findTopViewController].view addSubview:splashScreen]; ... 

puedes hacer algo como:

 #import "AppDelegate.h" #define kSplashScreen (UIScreen.mainScreen.bounds.size.height == 568) ? @"Default-568h" \ : (UIScreen.mainScreen.bounds.size.height == 667) ? @"Default-667" \ : (UIScreen.mainScreen.bounds.size.height == 736) ? @"Default-Portrait" \ : @"Default" @interface AppDelegate () @property (nonatomic) UIWindow *splashWindow; @property (nonatomic) UIWindow *keyWindow; @property (nonatomic, getter=isSplashConfigunetworking) BOOL splashConfigunetworking; @property (nonatomic, getter=isShowingSplash) BOOL showingSplash; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self animateSplash]; return YES; } - (void)applicationDidEnterBackground:(UIApplication *)application { [self showOrHideSplash]; } - (void)applicationWillEnterForeground:(UIApplication *)application { [self showOrHideSplash]; } - (void)showOrHideSplash { [self.splashWindow setHidden:[self isShowingSplash]]; if ([self isShowingSplash]) { [self.keyWindow makeKeyAndVisible]; } else { [self.splashWindow makeKeyAndVisible]; [self animateSplash]; } self.showingSplash = !self.showingSplash; } - (void)animateSplash { if ([self isSplashConfigunetworking]) { [self.window.rootViewController.view addSubview:self.splashWindow]; [self.window makeKeyAndVisible]; } else { self.keyWindow = [[UIApplication shanetworkingApplication] keyWindow]; self.splashWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.splashWindow.rootViewController = [[UIViewController alloc] init]; self.splashWindow.rootViewController.view.frame = self.splashWindow.bounds; UIImageView *splashImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:kSplashScreen]]; splashImage.frame = self.splashWindow.bounds; [self.splashWindow.rootViewController.view addSubview:splashImage]; [self.splashWindow makeKeyAndVisible]; [self.splashWindow setHidden:YES]; self.splashConfigunetworking = YES; } NSLog(@"begin splash"); __weak AppDelegate* weakSelf = self; [UIView animateWithDuration:4.2 delay:0.5 options:UIViewAnimationOptionCurveEaseOut animations: ^{ weakSelf.splashWindow.alpha = 1.0; weakSelf.splashWindow.alpha = 0.0; } completion: ^(BOOL finished) { [weakSelf.splashWindow removeFromSuperview]; NSLog(@"end splash"); }]; } @end 

Esta es una solución un poco engorrosa, pero funciona bien. La idea es agregar una nueva UIWindow encima de todos los controlleres

 - (void)showSplash { id <UIApplicationDelegate> appDelegate = [[UIApplication shanetworkingApplication] delegate]; UIWindow *window = [[UIWindow alloc] initWithFrame:[appDelegate window].frame]; UIViewController *splashController = [UIViewController new]; UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]]; splashController.view = imgView; window.rootViewController = splashController; window.windowLevel = UIWindowLevelAlert; window.hidden = NO; [window makeKeyAndVisible]; [UIView animateWithDuration:4.2 delay:0.5 options:UIViewAnimationOptionCurveEaseOut animations:^{ window.alpha = 0.0; } completion:^(BOOL finished) { window.hidden = YES; window.rootViewController = nil; [[appDelegate window] makeKeyAndVisible]; [[appDelegate window] setNeedsDisplay]; }]; } 

Encuentre a continuación una solución para este problema.

Dividir el código de la pantalla de bienvenida en dos methods; showSplash y hideSplash .

Llame a showSplash en el método applicationWillResignActive . En el método, cree y agregue imageView a rootViewController ; establece que es alfa a 0.0f y luego anima a alfa 1.0f. Esto es para asegurarse de que el usuario no vea imageView cuando la aplicación vaya a segundo plano.

Ahora llama a hideSplash en applicationDidBecomeActive . En hideSplash elimine imageView con animation. Vea el código a continuación;

 -(void)showSplash { _splashScreen = [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"Default"]]; [self.window.rootViewController.view addSubview:_splashScreen]; _splashScreen.alpha = 0.0f; [UIView animateWithDuration:0.3f animations:^{ _splashScreen.alpha = 1.0f; }]; } - (void)hideSplash { [UIView animateWithDuration: 4.2 delay: 0.5 options: UIViewAnimationOptionCurveEaseOut animations: ^{ _splashScreen.alpha = 0.0; } completion: ^ (BOOL finished) { [_splashScreen removeFromSuperview]; NSLog(@"end splash"); } ]; } - (void)applicationWillResignActive:(UIApplication *)application { [self showSplash]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [self hideSplash]; } 

¡Espero que esto ayude! Todos los derechos reservados

Añadir

 splashScreen.frame = self.window.rootViewController.view.frame; 

abajo

 UIImageView *splashScreen = [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"alertBg.png"]]; 

ejemplo

 -(void)showSplash { UIImageView *splashScreen = [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"Default.png"]]; splashScreen.frame = self.window.rootViewController.view.frame; [self.window.rootViewController.view addSubview: splashScreen]; [self.window makeKeyAndVisible]; NSLog(@"begin splash"); [UIView animateWithDuration: 4.2 delay: 0.5 options: UIViewAnimationOptionCurveEaseOut animations: ^{ splashScreen.alpha = 0.0; } completion: ^ (BOOL finished) { [splashScreen removeFromSuperview]; NSLog(@"end splash"); } ]; } 

La mejor manera de lograr esto es agregar la image en AppDelegate's window . En el siguiente código, statusView es una de las vistas, que consta de alguna image. Entonces agréguelo a AppDelegate's window su AppDelegate's window como una subView

 [[[[UIApplication shanetworkingApplication] delegate] window] addSubview:statusView]; 

Ahora cuando quiera que aparezca durante un cierto time, muestra esta vista, pero al mismo time, muévala al frente .

 -(void)showStatusView{ [UIView animateWithDuration:0.5 animations:^{ [[[[UIApplication shanetworkingApplication] delegate] window] bringSubviewToFront:statusView]; statusView.alpha = 1; }]; } 

Mejor Llame al método anterior en el método AppDelegate's didBecomeActive .

Además, muestre la pantalla de inicio tan pronto como la aplicación se va a renunciar activa . De esta manera, iOS tomará la instantánea de la pantalla, que se mostrará durante una fracción de segundos cuando la aplicación esté a punto de activarse.

 - (void)applicationDidEnterBackground:(UIApplication *)application { [self showStatusView]; } - (void)applicationWillEnterForeground:(UIApplication *)application { [self showStatusView]; } 

Una vez que la aplicación está activa, puede mostrar la pantalla de bienvenida real durante un time y luego su estado de aplicación habitual.

Primero crea tu pantalla de inicio o image en la function didFinishLaunchingWithOptions .

AppDelegate.m

Después de esto, escribe tu código como este:

introduzca la descripción de la imagen aquí

El controller de vista raíz no siempre es el controller de vista presentado. Esto puede hacer que su pantalla de bienvenida se oculte debajo de muchos otros controlleres de vista. Intente usar algo parecido (swift syntex):

 func getTopViewController() -> UIViewController?{ if var topController = UIApplication.shanetworkingApplication().keyWindow?.rootViewController{ while ((topController.presentedViewController) != nil) { topController = topController.presentedViewController! } return topController } return nil } 

Y agregue su vista de bienvenida al controller de vista superior

inicie su aplicación normalmente de todas las maneras, llame a su método en applicationBecomeActive y agregue la vista de la image en Appdelegate.window y elimínela después de un time por el timer.

 [self.window addSubview: splashScreen]; 

Debe usar la siguiente línea:

 [self.window addSubview: splashScreen]; 

en lugar de

 [self.window.rootViewController.view addSubview: splashScreen];