iPhone: лучший способ определить конец анимации последовательности изображений UIImageView - PullRequest
8 голосов
/ 22 сентября 2010

Мы знаем, что UIImageView имеет очень хорошую поддержку анимации последовательности изображений.Мы можем легко создать массив объектов UIImage, установить свойство animationImages, настроить продолжительность анимации, количество повторений и т. Д., А затем просто запустить.Но, кажется, нет никакого способа узнать, когда эта анимация закончилась.

Скажем, у меня есть десять изображений, и затем я хочу запустить анимацию (количество повторов = 1) с ними.И когда анимация закончится, я хочу запустить другой код.Каков наилучший способ узнать, что анимация закончилась?

Я уже понимаю, что могу создать NSTimer и запланировать его запуск после окончания анимации.Но вы действительно не можете полагаться на таймер, если вам нужна хорошая точность.

Итак, мой вопрос, есть ли лучший способ узнать, что анимация последовательности изображений UIImageView закончилась без использования таймера?

Код выглядит примерно так

myImageView.animationImages = images; // images is a NSArray of UIImages
myImageView.animationDuration = 2.0;
myImageView.animationRepeatCount = 1;

[myImageView startAnimating]

Ответы [ 3 ]

8 голосов
/ 22 сентября 2010

Свойство isAnimating в UIImageView должно перейти в NO, когда оно завершит анимацию. Это не формальное свойство, поэтому вы не можете установить наблюдение за ним. Вы можете опросить его по мелкозернистому таймеру (например, CADisplayLink).

Для этого нет делегата "анимация завершена", если вы ищете именно это. Время может изменяться в зависимости от задержки загрузки изображений и т. Д., И нет, нет точного способа точно узнать, когда это будет сделано.

Анимация изображений в UIImageView является удобной и недостаточно тяжелой, чтобы с ней можно было серьезно работать. Если вам нужна такая точность, подумайте о том, чтобы сделать это самостоятельно.

1 голос
/ 03 мая 2013

Я сделал это (метод моего подкласса UIImageView).

-(void)startAnimatingWithCallback:(UIImageViewAnimationCompletitionBlock) completitionCallback
{
    [self startAnimating];

    dispatch_queue_t animatingQueue = dispatch_get_current_queue();
    dispatch_queue_t pollingQueue = dispatch_queue_create("pollingQueue", NULL);
    dispatch_async(pollingQueue, ^{

        while(self.isAnimating) { usleep(10000); }
        dispatch_async(animatingQueue, ^{ if (completitionCallback) completitionCallback(); });

    });
}

Простое использование:

[self.oneView fadeOut];
[self.otherView startAnimatingWithCallback:^
{
    [self.oneView fadeIn];
}];
0 голосов
/ 31 декабря 2015

Кроме того, я мог бы рекомендовать установить изображение по умолчанию UIImageView (свойство image) в первом кадре анимации и изменить его на последний кадр сразу после запуска анимации (метод startAnimating).Таким образом мы избегаем уродливого удара, который может произойти, когда анимация закончена, но обратный вызов не вызывается.

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