Swift + UIImageView: переключаться между двумя последовательностями кадров анимации? - PullRequest
0 голосов
/ 30 апреля 2019

Пример кода для анимации:

func startAnimation(index: Int) {
var jumpImages = ["Jump_1","Jump_2","Jump_3","Jump_4","Jump_5","Jump_6","Jump_7","Jump_8","Jump_9","Jump_10"]
if index == 1 {
     jumpImages = ["Jump_11","Jump_21","Jump_31","Jump_41","Jump_51","Jump_61","Jump_71","Jump_81","Jump_91","Jump_101"]
}
    var images = [UIImage]()
    for image in jumpImages{
        images.append(UIImage(named: image)!)
    }
    self.imageView.frame.origin.y = self.imageView.frame.origin.y + 100.0
    self.imageView.animationImages = images
    self.imageView.animationDuration = 2.0
    self.imageView.animationRepeatCount = 1
    self.imageView.startAnimating()
}
startAnimation(index: 0)
...
startAnimation(index: 1)

ПРИМЕЧАНИЕ. Оба вызова startAnimation находятся в главном потоке, но не в одном цикле выполнения.

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

Как решить эту проблему?

1 Ответ

0 голосов
/ 03 мая 2019

Хорошо, я думаю, что теперь понимаю вашу проблему - из вашего заявления " [...] но похоже, что я установил последнее изображение в последовательности jumpImages вместо ", я думаю, вы означает, что когда вы вызываете startAnimation (index: 1) , вы видите только последний кадр анимации с индексом 0 и ни одну из анимаций с индексом 1.

Предполагая, что это правильно, ваша проблема здесь будет в состоянии гонки.

Когда вы вызываете startAnimation () , а затем во второй раз с индексом 1, первая анимация может продолжаться или не выполняться.

Решением будет вызов self.imageView.stopAnimating () до того, как вы измените все изображения и запустите новую анимацию. Рекомендуется проверять флаг imageView.isAnimating перед его вызовом. Примерно так:

func startAnimation(index: Int) {
    var jumpImages = ["Jump_1","Jump_2","Jump_3","Jump_4","Jump_5","Jump_6","Jump_7","Jump_8","Jump_9","Jump_10"]
    if index == 1 {
         jumpImages = ["Jump_11","Jump_21","Jump_31","Jump_41","Jump_51","Jump_61","Jump_71","Jump_81","Jump_91","Jump_101"]
    }
    var images = [UIImage]()
    for image in jumpImages{
        images.append(UIImage(named: image)!)
    }

    if self.imageView.isAnimating {
        self.imageView.stopAnimating()
    }
    self.imageView.frame.origin.y = self.imageView.frame.origin.y + 100.0
    self.imageView.animationImages = images
    self.imageView.animationDuration = 2.0
    self.imageView.animationRepeatCount = 1
    self.imageView.startAnimating()
}
startAnimation(index: 0)
...
startAnimation(index: 1)

Кроме того, поскольку вы находитесь в функции, а не в замыкании, вы можете удалить все эти ссылки на self. , что делает вещи немного короче:

func startAnimation(index: Int) {
    var jumpImages = ["Jump_1","Jump_2","Jump_3","Jump_4","Jump_5","Jump_6","Jump_7","Jump_8","Jump_9","Jump_10"]
    if index == 1 {
         jumpImages = ["Jump_11","Jump_21","Jump_31","Jump_41","Jump_51","Jump_61","Jump_71","Jump_81","Jump_91","Jump_101"]
    }
    var images = [UIImage]()
    for image in jumpImages{
        images.append(UIImage(named: image)!)
    }

    if imageView.isAnimating {
        imageView.stopAnimating()
    }
    imageView.frame.origin.y = imageView.frame.origin.y + 100.0
    imageView.animationImages = images
    imageView.animationDuration = 2.0
    imageView.animationRepeatCount = 1
    imageView.startAnimating()
}
startAnimation(index: 0)
...
startAnimation(index: 1)
...