Могу ли я остановить анимацию UIImageView на последнем кадре? - PullRequest
32 голосов
/ 06 мая 2010

У меня есть анимация с использованием UIImageView

myAnimatedView.animationImages = myImages;
myAnimatedView.animationDuration = 1;
myAnimatedView.animationRepeatCount = 1;
[myAnimatedView startAnimating];

Как я могу сказать анимации остановиться на последнем кадре или быть видимым последним кадром серии изображений?

СпасибоВы заранее

Ответы [ 7 ]

73 голосов
/ 09 августа 2010

свойство image в классе UIImageView имеет следующие документы: «Если свойство animationImages содержит значение, отличное от nil, содержимое этого свойства не используется.»

Таким образом, хитрость для удержания последнего кадра анимации в iOS4 заключается в том, чтобы сначала установить для свойства изображения последний кадр (пока animationImages все еще равен нулю), затем установить свойство animationImages и вызвать startAnimating. Когда анимация завершится, отобразится свойство изображения. Обратного вызова / делегата не требуется.

15 голосов
/ 01 августа 2012

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

// create your array of images
NSArray *images = @[[UIImage imageNamed:@"video1.png"], [UIImage imageNamed:@"video2.png"]];
UIImageView *imageView = [UIImageView new];
imageView.image = images.lastObject;
imageView.animationImages = images;
imageView.animationDuration = 1.0; // seconds
imageView.animationRepeatCount = 1;
[imageView startAnimating];
6 голосов
/ 06 мая 2010

После завершения анимации вы можете установить свое изображение UIImageView в последний кадр вашей анимации.

myAnimatedView.image = [myAnimatedImages objectAtIndex:myAnimatedImages.count - 1]

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

Документация UIImageViewAnimation

1 голос
/ 06 октября 2016

Я достиг этого, создав подкласс UIImageView, переопределив startAnimating () и установив свойство image как последнее изображение в массиве изображений перед вызовом super.startAnimating (). Это в дополнение к установке animationRepeatCount в 1 достигает желаемого эффекта.

Вот мой класс Swift:

class SuccessAnimationImageView: UIImageView {

var duration: NSTimeInterval = 2

override func didMoveToSuperview() {
    super.didMoveToSuperview()
    setupImages()
}

override func startAnimating() {
    setLastFrame()
    super.startAnimating()
}

func setupImages() {
    animationImages = ImageHelper.successAnimationImages
    image = animationImages?.first
    animationRepeatCount = 1
}

func setLastFrame() {
    image = animationImages?.last
}
}
1 голос
/ 06 апреля 2013

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

so... just before your last line...
// quickly hide the view that only holds the first frame
myOtherView.hidden = YES;
// start the animation
[myAnimatedView startAnimating];
// show the animation view
myAnimatedView.hidden = NO;
// BAM, done. It will use the last image when it ends.

Меньше кода, больше IB, когда это возможно.

0 голосов
/ 14 апреля 2016

Вы можете остановить анимацию, установив свойство UIImageView animateImg.animationDuration = 1

0 голосов
/ 14 февраля 2013

Вы установили для свойства removeOnCompletion анимации вращения значение NO, например, rota.removedOnCompletion = NO;

Это должно оставить слой представления там, где он был после завершения анимации.По умолчанию используется значение YES, которое возвращает значение модели, т. Е. Поведение, которое вы описываете.Также должен быть установлен fillMode,

, т.е. rota.fillMode = kCAFillModeForwards;

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