2015-07-23 6 views
0

Я пытаюсь сделать анимацию на кнопке при нажатии кнопки. Дело в следующем. На кнопке будет изображение яблока. При нажатии она изменится на image1, image2, image3 (например .gif), а затем будет изображение груши. Прямо сейчас я просто вижу, как это меняется с яблока на грушу и пропускает анимацию, которую я пытаюсь создать.UIButton Animation in Swift

Это код анимационной части:

var image1:UIImage = UIImage(named: buttonAnimationImage1)!; 
    var image2:UIImage = UIImage(named: buttonAnimationImage2)!; 
    var image3:UIImage = UIImage(named: buttonAnimationImage3)!; 

    sender.imageView!.animationImages = [image1, image2, image3]; 
    sender.imageView!.animationDuration = 1.5; 
    sender.imageView!.startAnimating(); 

ответ

5

Вы можете иметь это поведение, используя animated images.

var image1:UIImage = UIImage(named: buttonAnimationImage1)!; 
var image2:UIImage = UIImage(named: buttonAnimationImage2)!; 
var image3:UIImage = UIImage(named: buttonAnimationImage3)!; 
var images = [image1, image2, image3] 
var animatedImage = UIImage.animatedImageWithImages(images, duration: 1.5) 
sender.setImage(animatedImage, forState: UIControlState.Normal) 

Единственная проблема заключается в том, что анимация будет продолжаться вечно. Более того, вы не можете сказать анимированным изображениям количество раз, когда анимация будет запущена. Итак, чтобы остановить анимацию, по истечении необходимого времени вам нужно будет снова изменить изображение кнопки и установить изображение груши.

Полный исходный код:

// setting the images that conform the animation 
var image1:UIImage = UIImage(named: buttonAnimationImage1)!; 
var image2:UIImage = UIImage(named: buttonAnimationImage2)!; 
var image3:UIImage = UIImage(named: buttonAnimationImage3)!; 
var images = [image1, image2, image3] 
var animatedImage = UIImage.animatedImageWithImages(images, duration: 1.5) 
sender.setImage(animatedImage, forState: UIControlState.Normal) 

// code for setting the pear image to the button after a delay 
let delay = 1.3 * Double(NSEC_PER_SEC) 
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
dispatch_after(time, dispatch_get_main_queue()) { 
    sender.setImage(pearImage, forState: .Normal) 
} 
+1

Хах! Я НИКОГДА не видел этот метод раньше. Очень удобно знать. Спасибо – Fogmeister