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
- Начать анимацию
-
Следующий код использует #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
с анимацией для подражания.