如何将动画效果应用于 UIImageView 幻灯片

How to apply an animation effect to UIImageView slideshow

在 Swift 3.0 上,我如何将一些动画效果应用到此幻灯片?找不到与 animationWithDuration 方法相关的动画效果。

    let image1 = UIImage(named: "image1")!
    let image2 = UIImage(named: "image2")!
    let image3 = UIImage(named: "image3")!


    var imagesArray : [UIImage] = []



    override func viewDidLoad() {
        super.viewDidLoad()


        imagesArray = [image1, image2, image3]

        myView.clipsToBounds = true


        myView.animationImages = imagesArray
        myView.animationDuration = 10.0
        myView.animationRepeatCount = 0
        myView.startAnimating()

    }

您似乎在使用 UIImageView 的内置帧动画。这是为了循环浏览图像而设计的,就像动画 gif 一样。它并没有比这更复杂的动画。如果你想要过渡效果,你可以做的是在两个图像视图之间交替,并使用 UIView 动画方法在它们之间切换。这只是通过操纵 alpha 进行交叉淡入淡出:

    var images = [UIImage]()
    var currentImageindex = 0
    func animateImageViews() {
        swap(&firstImageView, &secondImageView)
        secondImageView.image = images[currentImageindex]
        currentImageindex = (currentImageindex + 1) % images.count
        UIView.animate(withDuration: 1, animations: {
            self.firstImageView.alpha = 0
            self.secondImageView.alpha = 1
            }, completion: { _ in
            self.animateImageViews()
        })
    }

这里是演示其工作原理的游乐场。您需要将 2 张图像放入名为 1.png 和 2.png 的资源文件夹中才能正常工作。请注意,像这样设置视图框架是可怕的编程实践,我只是在这里为简洁起见。在您的实际代码中使用界面构建器和自动布局。

    import PlaygroundSupport
    import UIKit

    class Demo: UIViewController {
        let button = UIButton()


        var firstImageView = UIImageView()
        var secondImageView = UIImageView()
        var images = [UIImage]()
        var currentImageindex = 0
        override func viewDidLoad() {
            view.addSubview(firstImageView)
            view.addSubview(secondImageView)
            images.append(UIImage(named: "1.png")!)
            images.append(UIImage(named: "2.png")!)
            firstImageView.image = images[0]
            secondImageView.image = images[1]
        }

        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
            firstImageView.frame = view.frame
            secondImageView.frame = view.frame
        }

        override func viewDidAppear(_ animated: Bool) {
            animateImageViews()
        }

        func animateImageViews() {
            swap(&firstImageView, &secondImageView)
            secondImageView.image = images[currentImageindex]
            currentImageindex = (currentImageindex + 1) % images.count
            UIView.animate(withDuration: 1, animations: {
                self.firstImageView.alpha = 0
                self.secondImageView.alpha = 1
                }, completion: { _ in
                self.animateImageViews()
            })
        }
    }
    let viewcontroller = Demo()
    viewcontroller.view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
    PlaygroundPage.current.liveView = viewcontroller.view