Отдельные повторяющиеся таймауты для UIView.animate - PullRequest
0 голосов
/ 18 февраля 2020

Метод UIView.animate () в UIKit представляется полезным при реализации многих анимаций. Однако недавно я столкнулся с проблемой при реализации серии повторяющихся анимаций с разными таймаутами.

Предположим, у нас есть список изображений let images: [UIImage] и просмотр изображений @IBOutlet weak var presentingImageView: UIImageView!. Мы хотим, чтобы он менял свое изображение каждые 3,0 секунды, для этого случая мы напишем следующий код:

Timer.scheduledTimer(withTimeInterval: 3.0, repeats: true) { _ in
    self.index += 1
}

UIView.animate(withDuration: 3.0,
               delay: 0.1,
               options: .repeat,
               animations: { 
                   self.presentingImageView.image = images[index]
               })

И это будет работать, но что, если у нас также есть массив длительностей let durations: [TimeInterval] и мы хотим менять изображения каждые duration[index] секунд?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Вместо таймера вы можете вызывать функцию 'changeImage' каждые 'длительности [индекс]'.

func changeImage() {
    let duration = durations[index]
    UIView.animate(withDuration: duration,
                   delay: 0.1,
                   options: .repeat,
                   animations: {
                    self.presentingImageView.image = self.images[self.index]
                    DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
                        self.changeImage()
                    }
    })
}
0 голосов
/ 18 февраля 2020

Затем вложите их и удалите repeat

Timer.scheduledTimer(withTimeInterval: 3.0, repeats: true) { _ in
    self.index += 1
    guard self.duration.count > index, self.images.count > index else { return }
    UIView.animate(withDuration:self.duration[index],
           delay: 0.1,
           options: .repeat,  
    animations: { 
            self.presentingImageView.image = self.images[index]
    })
}
...