Показывать экран заставки каждый раз, когда приложение становится активным

Я хочу, чтобы экран заставки отображался каждый раз, когда приложение становится активным. Я создал функцию showSplash которую я вызываю в 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"); } ]; } 

Вот как я называю эту функцию:

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

Но экран всплеска не появляется. Пожалуйста, поправьте меня.

после добавления всплеска – доведите его до фронта

изменение

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

в

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

Если вы хотите, чтобы приложение получало новый старт каждый раз, когда вы возвращаетесь к нему, вы также можете отключить фоновое выполнение, как указано в документации Apple (последний раздел под названием «Отказ от выполнения фона»):

Если вы не хотите, чтобы ваше приложение запускалось в фоновом режиме вообще, вы можете явно отказаться от фона, добавив ключ UIApplicationExitsOnSuspend (со значением YES) в файл Info.plist вашего приложения.

Пожалуйста, убедитесь, что основной вид контроллера корневого окна вашего окна является самым большим видом в вашем приложении в тот момент, когда вы хотите показать всплеск …

Проверьте рамку splashScreen (UIImageView). Установите его рамку в рамки вашего контроллера корневого представления.

Вы можете попытаться выследить контроллер верхнего уровня с помощью рекурсии:

 - (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; } 

Теперь вызов [self findTopViewController] должен надеяться вернуть [self findTopViewController] видимый / верхний VC вашего приложения, и вы можете сделать:

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

вы можете сделать что-то вроде:

 #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=isSplashConfigured) BOOL splashConfigured; @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 isSplashConfigured]) { [self.window.rootViewController.view addSubview:self.splashWindow]; [self.window makeKeyAndVisible]; } else { self.keyWindow = [[UIApplication sharedApplication] 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.splashConfigured = 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 

Это немного громоздкое решение, но оно отлично работает. Идея заключается в добавлении нового UIWindow поверх всех контроллеров

 - (void)showSplash { id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] 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]; }]; } 

Ниже приведено решение проблемы.

Разделить код заставки на два метода; showSplash и hideSplash .

Вызовите showSplash в методе applicationWillResignActive . В методе создайте и добавьте imageView в rootViewController ; установите его альфа-0.0f, а затем оживите его до альфа 1.0f. Это делается для того, чтобы пользователь не видел imageView, когда приложение будет фоном.

Теперь вызовите hideSplash в applicationDidBecomeActive . В hideSplash удалите imageView с анимацией. См. Код ниже;

 -(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]; } 

Надеюсь, это поможет! 🙂

Добавить

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

ниже

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

пример

 -(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"); } ]; } 

Лучший способ добиться этого – добавить изображение в AppDelegate's window . В приведенном ниже коде statusView является одним из видов, состоящих из некоторого изображения. Поэтому добавьте его в AppDelegate's window subView в качестве subView

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

Теперь, когда вы хотите, чтобы он появлялся в течение некоторого времени, вы показываете это представление, но в то же время приносите его вперед .

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

Лучше Вызовите вышеуказанный метод по методу didBecomeActive .

Также покажите заставку, как только приложение будет отменено . Таким образом, iOS возьмет снимок экрана, который будет отображаться в течение нескольких секунд, когда приложение вот-вот станет активным.

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

Когда приложение будет активным, вы можете отобразить фактический экран заставки на некоторое время, а затем ваше обычное состояние приложения.

Сначала создайте свой экран запуска или изображение в функции didFinishLaunchingWithOptions .

AppDelegate.m

После этого напишите свой код,

введите описание изображения здесь

Контроллер корневого представления не всегда является представленным контроллером представления. Это может привести к тому, что ваш экран заставки будет скрыт под кучей других контроллеров. Попробуйте использовать что-то вроде (swift syntex):

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

И добавьте ваш всплеск в контроллер верхнего уровня

запускайте приложение обычно каждый раз, вызывайте свой метод в applicationBecomeActive и добавляйте изображение на Appdelegate.window и удаляете его через некоторое время по таймеру.

 [self.window addSubview: splashScreen]; 

Вы должны использовать следующую строку:

 [self.window addSubview: splashScreen]; 

вместо

 [self.window.rootViewController.view addSubview: splashScreen]; 
  • Заставка не меняется после обновления до более новой версии
  • как загрузить соответствующий Default.png в UImageView?
  • Экран заставки «Кордова» изменяет положение счетчика?
  • iOS: обход заставки
  • Кордова 3.4 белый экран iOS после всплеска
  • Давайте будем гением компьютера.