Swift - Как анимировать изображения?

Я пытаюсь оживить изображения, в частности time-. Он отлично работает в Objective C. Однако он не работает для Swift, где моя ошибка?

Код для Objective-C -

-(void)viewDidLoad
{
   [super viewDidLoad];
   NSMutableArray *imgListArray=[NSMutableArray array];
   for (int i=0; i<=11; i++)

   {
       NSString *strImageName=[NSString stringWithFormat:@"c%d.png", i];
       NSLog(@"%@",strImageName);
       UIImage *image=[UIImage imageNamed:strImageName];
       [imgListArray addObject:image];
   }

   self.imgView.animationImages = imgListArray;
   self.imgView.animationDuration =1.0f;    
   [self.imgView startAnimating];
   // Do any additional setup after loading the view, typically from a nib
}

Код для быстрого is-

override func viewDidLoad()
{
   super.viewDidLoad()

   var imgListArray :NSMutableArray = []
   for countValue in 1...11
   {
      var strImageName : String = "c\(countValue).png"
      var image = UIImage(named:strImageName) // suggested by Anil
      imgListArray.addObject(image)
   }

   // Swift code HERE for Objective c
}

Ответы

Ответ 1

[UIImage imageNamed (strImageName)]

Это не быстрый код. Быстро это было бы

UIImage(named:strImageName)  

Измененный код:

var imgListArray :NSMutableArray = []
for countValue in 1...11
    {

        var strImageName : String = "c\(countValue).png"
        var image  = UIImage(named:strImageName)
        imgListArray .addObject(image)
    }

    self.imageView.animationImages = imgListArray;
    self.imageView.animationDuration = 1.0
    self.imageView.startAnimating()

Ответ 2

для Swift 2 вместо этого используйте [UIImage].

var images: [UIImage] = []
for i in 1...2 {
    images.append(UIImage(named: "c\(i)")!)
}
myImageView.animationImages = images
myImageView.animationDuration = 1.0
myImageView.startAnimating()

Ответ 3

С быстрым шагом вы можете сделать еще один шаг и сделать простую линию:

let loadingImages = (1...11).map { UIImage(named: "c\($0)")! }

Затем вы можете сделать все остальное и вставить это в imageView

self.imageView.animationImages = loadingImages
self.imageView.animationDuration = 1.0
self.imageView.startAnimating()

Ответ 4

В быстром 3 - Создайте массив изображений и просто оживите это.

func animate_images()
{
    let myimgArr = ["1.jpg","2.jpg","3.jpg"]
    var images = [UIImage]()

    for i in 0..<myimgArr.count
    {
        images.append(UIImage(named: myimgArr[i])!)
    }

    imgView_ref.animationImages = images
    imgView_ref.animationDuration = 0.04
    imgView_ref.animationRepeatCount = 2
    imgView_ref.startAnimating()
}

А для остановки анимации просто напишите

 imgView_ref.stopAnimating()

Ответ 5

другой подход, если вы хотите оживить массив изображений:

var counter = 1
var timer = NSTimer()
@IBOutlet weak var someImg: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: Selector("doSomeAnimation"), userInfo: nil, repeats: true)
}

func doSomeAnimation() {
    //I have four pngs in my project, which are named frame1.png ... and so on


       if counter == 4 {

        counter = 1

        }else {

        counter++
    }

    someImg.image = UIImage(named: "frame\(counter).png")
}

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

Ответ 6

Для тех, кто выполняет несколько анимаций, в зависимости от переменной, попробуйте ниже.

Например, вы можете запустить анимацию, отправляющую 0 или 1 (возможно, если ваше приложение знает свое дневное или ночное время):

func runAnimation (imgView: UIImageView, arrayPos: Int) {
    let timingArray = [7.0,10.0] //Durations of each
    let frameArray = [43,45]  //Frames for each
    var imgArray: Array<UIImage> = [] //Setup empty array 

    for i in 1 ... frameArray[arrayPos] {
        //Fill empty array with images!!
        let imageToAdd = UIImage(named: "animationNum_\(arrayPos)-frameNum_\(i)")
        imgArray.append(imageToAdd!)
    }
    imgView.animationImages = imgArray
    imgView.animationDuration = timingArray[arrayPos]
    imgView.animationRepeatCount = 2
    imgView.startAnimating()
}

Ответ 7

Swift 3+

UIImageViews может анимировать изображения двумя разными способами (другие ответы уже охватывают первый путь в глубину):

    • Создайте массив [UIImage] с изображениями для анимации
    • Задайте свойство animationImages представления с помощью этого массива
    • Задайте свойство animationDuration
    • Начать анимацию
    • Инкапсулируйте анимацию в UIImage с помощью animatedImage(with:duration:)
    • Установите свойство обычного image вида

Следующий код использует #imageLiterals:

let images = [img1, img2, img3] // use of #imageLiterals here
let animation = UIImage.animatedImage(with: images, duration: 1)
self.myImageView.image = animation

Pro:

Если вам нужно сильно изменить образ UIImageView, и, возможно, одно из этих изображений должно быть анимировано, вам не нужно начинать/останавливать анимацию каждый раз больше, так как вам не нужно устанавливать свойство animatedImages обратно на nil для отображения изображение, сохраненное в свойстве изображения изображения.

Против:

Вы не можете запускать/останавливать анимацию, если она инкапсулирована в один UIImage вместо массива.


Подробнее о #imageLiterals :

Если вы хотите использовать литерал изображения, либо введите imageLiteral либо просто введите имя изображения из папки с вашими ресурсами и завершение кода Xcode, предложите его.

Дальнейшее чтение:

  • Еще один хороший пост в блоге об использовании #imageLiterals и #colorLiterals с анимацией для подражания.