Изменение UIView при срабатывании applicationWillEnterForeground - PullRequest
7 голосов
/ 27 сентября 2011

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

Ситуация в том, что я предоставил опции в своем комплекте настроек для внешнего видачто я хотел бы вступить в силу, когда applicationWillEnterForeground запущен.

У кого-нибудь есть предложения о том, как атаковать эту проблему?

Я пытался зарегистрировать NSNotification, но он запускается до поздней ипредставление отображается пользователю до запуска метода NSNotification.

Ответы [ 4 ]

7 голосов
/ 30 сентября 2011

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

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Get current view...  
    // (get from UITabbarController or whatever logic you like)

    // For this code sample, just grab first UIView under the main window
    UIView *myView = [self.window.subviews objectAtIndex:0];
}

Чтобы изменить вид перед его отображением, используйте метод applicationWillEnterForeground AppDelegate, напримерэто:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 80, 80)];
    label.backgroundColor = [UIColor whiteColor];
    label.text = @"yo";

    [self.myLastView addSubview:label];
}

Я понимаю, что вы упомянули applicationWillEnterForeground в вашем вопросе.Можете ли вы быть более конкретными с тем, что вы пытаетесь сделать, или, возможно, включить код? Я на самом деле пробовал код выше и обновление представления (я вижу метку "yo" над моим видом) .

Последнее мое предложение - попробовать позвонить [view setNeedsDisplay] и [view setNeedsLayout], которые должны заставить UIView перерисовывать себя. (примечание - проблема не в том, что изменения в uiview не отображаются, проблема в том, что они показываютпосле отображения старого представления. Похоже, что снимок экрана сделан перед приостановкой приложения, и этот снимок экрана первоначально отображается после возобновления работы приложения для повышения производительности)

Редактировать

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

Редактировать 2

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

Альтернативное решение 1

Закройте приложение, когда пользователь нажмет кнопку «Домой».

Если вы сохраняете состояние вашего приложения в applicationWillResignActive: или applicationWillTerminate:, вы можете просто восстановить это состояние (перейдите к правильной вкладке, в которой пользователь последний раз был), а в appDidFinishLaunchingWithOptions: вы можете обновить пользовательский интерфейспрежде чем пользователь увидит это.Чтобы завершить работу приложения, когда оно было фоновым (приостановлено), введите ключ «Приложение не работает в фоновом режиме» - необработанный ключ: UIApplicationExitsOnSuspend в ДА .

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

Альтернативное решение 2

Отображение ваших настроек внутри приложения.

Очевидно, что это потребует изменения дизайна, однако все больше и больше приложений отображают настройки внутри приложения.Популярная сторонняя библиотека - В наборе параметров приложения . Это позволяет настраивать параметры с помощью файла связки / plist точно так же, как и для глобальных настроек приложения. Он также выглядит и ведет себя так же, какглобальные настройки. Это даст вам полный контроль над любым поведением, которое вы хотите внутри вашего приложения.

0 голосов
/ 30 июля 2014

На случай, если кто-то столкнется с той же проблемой:
Похоже, что Apple реализовала новое свойство в iOS7 на UIApplication, которое не позволяет использовать ранее сделанный снимок при повторном входе на передний план - ignoreSnapshotOnNextApplicationLaunch

0 голосов
/ 01 октября 2011

В каждом viewDidLoad вы всегда можете опубликовать уведомление, см. NSNotification Class Reference, вы можете сохранить ссылку на представление в NSUserDefaults, а затем делать то, что вы нужно сделать, когда пользователь вернется в applicationWillEnterForeground:

0 голосов
/ 01 октября 2011

Я собираюсь догадаться, что он у вас задом наперед.

Система может сделать снимок текущего экрана, и он показывает это, когда ваше приложение восстанавливается на переднем плане.Может случиться так, что этот снимок показывает старый вид, прежде чем вы получите возможность изменить его в applicationWillEnterForeground: time.

Итак, измените, когда получите applicationWillEnterForeground:, тогда снимок будет взят из того, что вы хотитевосстановить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...