图片会在5秒钟后自动更改

时间:2018-08-24 13:15:45

标签: ios swift

我正在尝试编写一个代码,该代码会在5秒钟后使用交叉溶解或任何其他动画自动更改图像。可悲的是,我的代码无法正常工作。我也希望图像会一直变化。

extension UIImageView{
var imageWithFade:UIImage?{
    get{
        return self.image
    }
    set{
        UIView.transition(with: self,
                          duration: 0.5, options: .transitionCrossDissolve, animations: {
                            self.image = newValue
        }, completion: nil)
    }
}

}

override func viewDidLoad() {
    super.viewDidLoad()


    let firstImage: UIImage? = UIImage(named: "toa-heftiba-461336-unsplash.jpg");
    let secondImage: UIImage? = UIImage(named: "capturing-the-human-heart-475168-unsplash.jpg");

    imgView.imageWithFade = secondImage
}

此外,如何使这3张图像发生变化,而不仅仅是2张。 谢谢!!

3 个答案:

答案 0 :(得分:2)

UIImage有一个方法:

animatedImage(with images: [UIImage], duration: TimeInterval) -> UIImage?

您可以使用它来合成动画图像,然后在图像视图中进行设置。

答案 1 :(得分:0)

  

不幸的是,我的代码无法正常工作

duration: 0.5更改为duration: 5

  

我还希望图像一直在变化。

     

此外,如何使这3张图像发生变化,而不仅仅是2张。   谢谢!!

添加功能

 func repeatAnimateImagesChanges(images:NSArray, imageView:UIImageView) {

    if(images.count == 0) {
        return
    }

    var newImage = images.firstObject as! UIImage

    if(imageView.image != nil) {
        for i in 0..<images.count {
            newImage = images.object(at: i) as! UIImage
            if(imageView.image?.isEqual(newImage))! {
                newImage = i == images.count - 1 ? images.firstObject as! UIImage : images.object(at: i + 1) as! UIImage
            }
        }
    }

    imageView.imageWithFade = newImage

    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        self.repeatAnimateImagesChanges(images: images, imageView: imageView)
    }
}

将图像和imgView传递给它

 let img1 = UIImage.init(named: "1")
 let img2 = UIImage.init(named: "2")
 let img3 = UIImage.init(named: "3")

 let array = [img1,img2,img3]

 repeatAnimateImagesChanges(images: array as NSArray, imageView: self.imgView)

答案 2 :(得分:0)

我也许可以简化验证答案。

如果您有多个图像,并且希望每 5 秒更改一次:

class ViewController: UIViewController {
...
   let imageNames = ["image1", "image2", "image3"]
   var index = 0
   var Timer: Timer!
   @IBOutlet weak var imageView: UIImageView!

   //1.
   override func viewDidLoad() {
      super.viewDidLoad()
      imageView.image = UIImage(named: "image1")
   }

   //2.
   override func viewWillAppear(_ animated: Bool) {
      timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: 
      #selector(self.loop), userInfo: nil, repeats: true) 
   }
   
   //3.
   @objc
   func loop() {
      if index != imageNames.count - 1 {
          index += 1 
          changeImage(index: index)
      }else {
         index = 0
         changeImage(index: index)
      }   
   }

    //4.
    func changeImage(index: Int) {
       UIView.transition(with: self.imageView,
            duration: 2.0, //animation will take 2 seconds
            options: .transitionCrossDissolve,
            animations: {
                self.imageView.image = UIImage(named: 
                self.imageNames[index])
            }, completion: nil)
    }

  1. 用你的第一张图片初始化你的 imageView

  2. 您的计时器已准备好每 5 秒调用一次 loop()

  3. 循环是调用。如果您已显示所有图像,它将从第一张图像重新开始

  4. 您“通知”视图 imageView 以使用溶解选项开始下一个图像的过渡。由于参数 animation

    更改了图像

PS:如果你想停止计时器,我相信你必须调用 timer.invalidate()