Просмотр добавлен в applicationDidEnterBackground не отображается, пока приложение не вернется с фона

Я добавляю imageView в главное окно приложения в applicationDidEnterBackground:

- (void)applicationDidEnterBackground:(UIApplication *)application { UIImageView *splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"splashimage.png"]]; splash.frame = self.window.bounds; [self.window addSubview:splash]; } 

Я ожидаю, что когда я поставлю приложение в фоновом режиме, нажав кнопку дома устройства, а затем просмотрев диспетчер задач, дважды нажав кнопку «домой», я увижу показанный splashimage.png. Но кажется, что скриншот, который берется, когда приложение переходит в фоновый режим, не включает этот оверлейный образ. Я думал, что это будет, так как я добавил imageView без анимации.

Почему это может произойти?

UPDATE: даже если я скрою свое окно в applicationDidEnterBackground, я все еще вижу полное окно, незакрытое, в диспетчере задач после того, как приложение будет помещено в фоновое состояние. Окно становится скрытым через некоторое время после возвращения приложения из фона, когда я нажимаю кнопку «домой».

 - (void)applicationDidEnterBackground:(UIApplication *)application { //this does not work either! self.window.hidden = YES; } 

ОБНОВЛЕНИЕ: Я понимаю, кстати, что applicationDidEnterBackground имеет 5 секунд для завершения. Сейчас я тестирую это только

 self.window.hidden = YES; 

в applicationDidEnterBackground и ничего в applicationWillResignActive, и окно все еще не скрывается, когда приложение переходит в фоновый режим; только когда он возвращается на передний план. Итак, это говорит мне, что должно быть что-то еще, где-то в моем приложении, что не позволяет это произойти в applicationDidEnterBackground. Кстати, если я переведу

 self.window.hidden = YES; 

к applicationWillResignActive, окно скрывается, когда приложение переходит в фоновый режим. Но я пытаюсь выяснить, что будет препятствовать приложению завершить эту одиночную, простую, не анимированную задачу в applicationDidEnterBackground. Любые мысли оценили.

ОБНОВЛЕНИЕ: Эта конкретная проблема связана с использованием BannerViewController (iAd). Я использую его в UITabBarController. Не уверен, что конкретно проблема, или если она также связана с ее использованием в UITabBarController.

ОБНОВЛЕНИЕ: Я думаю, что проблема не связана с UITabBarController, но в целом BannerViewController (iAd). Теперь, чтобы понять, почему …

UPDATE: эта строка в BannerViewController.m вызывает проблему:

 [self.view addSubview:bannerView] 

в этом методе:

 - (void)viewDidLayoutSubviews { CGRect contentFrame = self.view.bounds, bannerFrame = CGRectZero; ADBannerView *bannerView = [BannerViewManager sharedInstance].bannerView; #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 NSString *contentSizeIdentifier; // If configured to support iOS <6.0, then we need to set the currentContentSizeIdentifier in order to resize the banner properly. // This continues to work on iOS 6.0, so we won't need to do anything further to resize the banner. if (contentFrame.size.width < contentFrame.size.height) { contentSizeIdentifier = ADBannerContentSizeIdentifierPortrait; } else { contentSizeIdentifier = ADBannerContentSizeIdentifierLandscape; } bannerFrame.size = [ADBannerView sizeFromBannerContentSizeIdentifier:contentSizeIdentifier]; #else // If configured to support iOS >= 6.0 only, then we want to avoid currentContentSizeIdentifier as it is deprecated. // Fortunately all we need to do is ask the banner for a size that fits into the layout area we are using. // At this point in this method contentFrame=self.view.bounds, so we'll use that size for the layout. bannerFrame.size = [_bannerView sizeThatFits:contentFrame.size]; #endif if (bannerView.bannerLoaded) { contentFrame.size.height -= bannerFrame.size.height; bannerFrame.origin.y = contentFrame.size.height; } else { bannerFrame.origin.y = contentFrame.size.height; } _contentController.view.frame = contentFrame; // We only want to modify the banner view itself if this view controller is actually visible to the user. // This prevents us from modifying it while it is being displayed elsewhere. if (self.isViewLoaded && (self.view.window != nil)) { [self.view addSubview:bannerView]; bannerView.frame = bannerFrame; #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 bannerView.currentContentSizeIdentifier = contentSizeIdentifier; #endif } } 

Не совсем понятно, почему и что, если что-то можно сделать, чтобы исправить это, если я все еще хочу использовать BannerViewController.

UPDATE: от принятого ответа ниже, вот что решило эту проблему для меня (bannerVC – ссылка на BannerViewController).

 - (void)applicationWillResignActive:(UIApplication *)application { [bannerVC.view snapshotViewAfterScreenUpdates:YES]; } 

UPDATE: Я понимаю, что этот код действительно должен быть в applicationDidEnterBackground. Но, похоже, AdBannerView не может остановить анимацию во времени, чтобы это произошло. Так что пока, по моему мнению, applicationWillResignActive – это все, что осталось, но это оставляет пользователю «меньше» опыта. Я был бы признателен за любые предложения о том, как остановить анимацию AdBannerView, чтобы снимок можно было показать в applicationDidEnterBackground, а не только при возврате из фона.

ОБНОВЛЕНИЕ: Чтобы воспроизвести проблему:

  1. Загрузить iAdSuite
  2. Откройте пример TabbedBanner.
  3. Добавьте код ниже в AppDelegate:
  4. Запустите приложение. (фреймы перепутаны, потому что они не были обновлены, но этот пример все равно покажет проблему)
  5. Нажмите кнопку «Дом» один раз, чтобы добавить приложение в фоновый режим.
  6. Дважды нажмите кнопку «Дом», чтобы увидеть приложение в диспетчере задач.

Если вы оставили код в приложении applicationWillResignActive и код в applicationDidEnterBackground раскоментирован, вы не увидите синего заставки в диспетчере задач. Но если вы прокомментировали код в applicationDidEnterBackground и раскомментировали код в applicationWillResignActive, вы должны увидеть синий заставку в диспетчере задач. Однако это нежелательно. Проблема заключается в том, как отображать заставку в методе applicationDidEnterBackground.

 - (void)applicationWillResignActive:(UIApplication *)application { //works - but undesirable //[self addDummyView]; //[_tabBarController.view snapshotViewAfterScreenUpdates:YES]; } - (void)applicationDidEnterBackground:(UIApplication *)application { //does not work - needs to work to show dummyview only when application actually goes into the background [self addDummyView]; [_tabBarController.view snapshotViewAfterScreenUpdates:YES]; } - (void)addDummyView { UIView *topView = _tabBarController.view; UIView *colorView = [[UIView alloc] initWithFrame:topView.frame]; [colorView setBackgroundColor:[UIColor blueColor]]; [topView addSubview:colorView]; [topView bringSubviewToFront:colorView]; } 

Когда метод applicationDidEnterBackground возвращается, снимок текущего представления приложения берется для просмотра многозадачности. Причина, по которой вы не видите обновление, заключается в том, что моментальный снимок выполняется до цикла рисования. Даже если вы вызываете setNeedsDisplay, моментальный снимок до сих пор выполняется.

Чтобы дождаться обновления вида (после добавления подзаголовка), вызовите это:

 [self.view snapshotViewAfterScreenUpdates:YES]; 

со значением YES . Это заставляет ваши изменения визуализировать в первую очередь. Вы можете прочитать больше об обработке таких вещей в яблочных документах здесь: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html#//apple_ref/doc/uid/ TP40007072-СН8-SW27

Вы можете получить ответ здесь: Показывать экран заставки, когда приложение вводит фон .

Сохраните код в приложенииWillResignActive.

Ваш код в порядке. Вы должны знать, что applicationDidEnterBackground не вызывается при двойном нажатии кнопки «домой». Он вызывается, когда вы переключаетесь на другое приложение или отправляетесь на трамплин.

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

Если он все еще не работает, вы должны увидеть, не является ли изображение изображения не нулевым. О, и, пожалуйста, не скрывайте окно приложения.

  • Шаблон проектирования iOS / Objective-C для пользовательских интерфейсов
  • iOS UITest - переход на все доступные экраны
  • Что вызывает ошибку -25204 получение моментального снимка для элемента во время тестирования пользовательского интерфейса приложения iOS
  • iOS - данные процесса без замораживания пользовательского интерфейса
  • iOS - Как найти правильный размер шрифта (в точках) с той же высотой, что и данный CGRect?
  • Интерфейс стиля iOS iOS
  • обновить текстовое поле ui в быстрых ios
  • Вставить UISlider как элемент в таблицу UIA в iOS7
  • Изменение CGRectMake (x, x, x, x) в другое место, такое как (y, y, y, y)
  • как изменить userInterfaceLayoutDirection
  • Программно установите кончик стрелки всплывающего окна ios
  • Давайте будем гением компьютера.