Перезапуск анимации при подключении контроллера представления - PullRequest
1 голос
/ 11 февраля 2012

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

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

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

https://gist.github.com/1802341

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

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

Я занимаюсь разработкой для iOS 5.

1 Ответ

1 голос
/ 11 февраля 2012

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

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

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

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

...