Почему моя неопределенная анимация UIView останавливается, когда мое приложение переходит в фоновый режим? - PullRequest
2 голосов
/ 12 января 2011

Я использую следующий код для анимации UIView на неопределенный срок:

#define DEFAULT_ANIM_SPPED 0.6
#define INFINATE_VALUE 1e100f

[UIView beginAnimations:nil context:nil];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationRepeatCount:INFINATE_VALUE];
[UIView setAnimationDuration:DEFAULT_ANIM_SPPED];
CGRect tempFrame=myView.frame;
tempFrame.origin.y -= 30;
myView.frame=tempFrame;
[UIView commitAnimations];

Если мое приложение переходит в фоновый режим, а затем я возвращаюсь к нему, все подобные анимации теперь останавливаются. Почему это происходит?

Ответы [ 3 ]

10 голосов
/ 12 января 2011

Обычно выполнение вашего приложения полностью приостанавливается, когда оно переходит в фоновый режим. Даже если ваше приложение остается активным (для отслеживания местоположения, VoIP или по какой-либо другой причине), все, что отображается на экране , будет остановлено , когда ваше приложение перейдет в фоновое состояние:

Не обновляйте окна и представления. В то время как в фоновом режиме, ваш окна приложения и виды не видно, поэтому вы не должны пытаться обновить их. Хотя создание и манипулирование окном и просмотр объектов на заднем плане не вызывает вашего Приложение должно быть прекращено, это работа должна быть отложена до вашего приложение перемещается на передний план.

На самом деле, если вы попытаетесь нарисовать контекст OpenGL ES в фоновом режиме, ваше приложение сразу же вылетит :

Не совершать никаких вызовов OpenGL ES из Ваш код. Вы не должны создавать EAGLContext объект или выдать любой OpenGL ES команды рисования любого рода, в то время как работает в фоновом режиме. Используя эти вызовы вызывают ваше приложение немедленно прекращено.

Как правило, рекомендуется приостановить любые анимации при перемещении приложения в фоновый режим, а затем возобновить их, как только ваше приложение окажется на переднем плане. Это может быть обработано в методах делегатов -applicationDidEnterBackground: и -applicationWillEnterForeground: или путем прослушивания уведомлений UIApplicationDidEnterBackgroundNotification и UIApplicationWillEnterForegroundNotification.

0 голосов
/ 21 декабря 2015

Как @BradLarson предложил в своем ответе , я добавил NSNotificationObserver для обработки UIApplicationDidEnterBackgroundNotification и UIApplicationWillEnterForegroundNotification в моем контроллере представления.

- (void) addNotificationObserver {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}

- (void) removeNotificationObserver {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
}

- (void) applicationDidEnterBackground:(NSNotification *)notification {
    // went to background
}

- (void) applicationWillEnterForeground:(NSNotification *)notification {
    // comes to foreground
}

- (void) viewDidLoad {
    [super viewDidLoad];
    [self addNotificationObserver];
}

- (void) dealloc {
    [self removeNotificationObserver];
}
0 голосов
/ 12 января 2011

iOs останавливает выполнение кода, когда приложение переходит в фоновый режим. Проверьте это.

...