我正在尝试编写一个代码,该代码会在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张。 谢谢!!
答案 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)
}
用你的第一张图片初始化你的 imageView
您的计时器已准备好每 5 秒调用一次 loop()
循环是调用。如果您已显示所有图像,它将从第一张图像重新开始
您“通知”视图 imageView
以使用溶解选项开始下一个图像的过渡。由于参数 animation
PS:如果你想停止计时器,我相信你必须调用 timer.invalidate()