Перезапуск анимации при подключении контроллера представления

Я пытаюсь повторно использовать вид эффекта Кена Бернса, созданный Хавьером Берланой (кстати, ему за это).

У меня есть вид на мой корневой контроллер вида. Когда я нажимаю новый контроллер представления и затем вынимаю его, анимация в представлении останавливается в конце анимации. Когда время перехода проходит, оно меняет изображение, и анимация снова работает.

Я огляделся, но не нашел рабочего решения этой проблемы. Моим последним решением было реализовать pauseLayer а также resumeLayer показано здесь (внизу):

https://gist.github.com/1802341

Я призываю эти методы на viewWillAppear а также viewWillDisappear на мой взгляд контроллер.

Что я должен сделать, чтобы приостановить / возобновить анимацию?

Я разрабатываю для iOS 5.

1 ответ

Из реализации Кена Бернса я вижу, что анимация обрабатывается с помощью цикла:

- (void)_startAnimations:(NSArray *)images
{
  @autoreleasepool {

    for (uint i = 0; i < [images count]; i++) {

        self.currentImage = i;

        NSOperationQueue *mainQueue      = [NSOperationQueue mainQueue];
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                             selector:@selector(_animate:) 
                                               object:[NSNumber numberWithInt:self.currentImage]];
        [mainQueue addOperations:[NSArray arrayWithObject:operation] waitUntilFinished:YES];

        sleep(self.timeTransition);
        i = (i == [images count]-1) && isLoop ? -1 : i; 
      }

   }
 }

Один из способов остановить анимацию - добавить флаг, например так:

    for (uint i = 0; i < [images count]; i++) {

        if (!animationSuspended) {
          self.currentImage = i;

          NSOperationQueue *mainQueue      = [NSOperationQueue mainQueue];
          NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                             selector:@selector(_animate:) 
                                               object:[NSNumber numberWithInt:self.currentImage]];
          [mainQueue addOperations:[NSArray arrayWithObject:operation] waitUntilFinished:YES];
          i = (i == [images count]-1) && isLoop ? -1 : i; 
        }  
        sleep(self.timeTransition);
      }

Таким образом, когда вы устанавливаете флаг, тело цикла выполняется только для создания задержки (сна), а остальное состояние остается неизменным.

Надеюсь это поможет.

Другие вопросы по тегам