16

Below is the code that automatically transitions between different images, every 5 seconds. I want to add animations to the transitions i.e. fade, scroll from left, etc. How would I go about doing this in Swift? Thanks.

class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    imageView.animationImages = [
        UIImage(named: "brooklyn-bridge.jpg")!,
        UIImage(named: "grand-central-terminal.jpg")!,
        UIImage(named: "new-york-city.jpg")!,
        UIImage(named: "one-world-trade-center.jpg")!,
        UIImage(named: "rain.jpg")!,
        UIImage(named: "wall-street.jpg")!]

    imageView.animationDuration = 25.0
    imageView.startAnimating()
}

3 Answers 3

35
class ViewController: UIViewController {
        @IBOutlet weak var imageView: UIImageView!

        let images = [
                UIImage(named: "brooklyn-bridge.jpg")!,
                UIImage(named: "grand-central-terminal.jpg")!,
                UIImage(named: "new-york-city.jpg"),
                UIImage(named: "one-world-trade-center.jpg")!,
                UIImage(named: "rain.jpg")!,
                UIImage(named: "wall-street.jpg")!]
        var index = 0
        let animationDuration: NSTimeInterval = 0.25
        let switchingInterval: NSTimeInterval = 3

        override func viewDidLoad() {
                super.viewDidLoad()

                imageView.image = images[index++]
                animateImageView()
        }

        func animateImageView() {
                CATransaction.begin()

                CATransaction.setAnimationDuration(animationDuration)
                CATransaction.setCompletionBlock {
                        let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(self.switchingInterval * NSTimeInterval(NSEC_PER_SEC)))
                        dispatch_after(delay, dispatch_get_main_queue()) {
                                self.animateImageView()
                        }
                }

                let transition = CATransition()
                transition.type = kCATransitionFade
                /*
                transition.type = kCATransitionPush
                transition.subtype = kCATransitionFromRight
                */
                imageView.layer.addAnimation(transition, forKey: kCATransition)
                imageView.image = images[index]

                CATransaction.commit()

                index = index < images.count - 1 ? index + 1 : 0
        }
}

Implement it as a custom image view would be better.

Sign up to request clarification or add additional context in comments.

6 Comments

@LeonardoSavioDabus, I think that is because you put your images in asset catalogs.
Exactly. So if I place it in the resources folder I probably have to use like that
Put images in asset catalogs is good, but if you put JPEG images directly in the bundle, you must have the extension when you are creating a UIImage. BTW, PNG file don't have this problem.
maybe it was because I used @2x.png files
How to add a callback function for the dispatched task?
|
4

animating code, based on this answer, in Swift 3

let animationDuration: TimeInterval = 0.25
let switchingInterval: TimeInterval = 3
func animateImageView()
{
    CATransaction.begin()

    CATransaction.setAnimationDuration(animationDuration)
    CATransaction.setCompletionBlock {
        DispatchQueue.main.asyncAfter(deadline: .now() + self.switchingInterval) {
            self.animateImageView()
        }
    }

    let transition = CATransition()
    transition.type = kCATransitionFade
    /*
     transition.type = kCATransitionPush
     transition.subtype = kCATransitionFromRight
     */
    imageView.layer.add(transition, forKey: kCATransition)
    imageView.image = images.object(at: index) as! UIImage

    CATransaction.commit()

    index = index < images.count - 1 ? index + 1 : 0
}

Comments

3

Here is a standalone class you can use to animate image change with fade animation.

class FadeImageView: UIImageView
{    
    @IBInspectable
    var fadeDuration: Double = 0.13

    override var image: UIImage? 
    {
        get {
            return super.image
        }
        set(newImage) 
        {
            if let img = newImage 
            {
                CATransaction.begin()
                CATransaction.setAnimationDuration(self.fadeDuration)

                let transition = CATransition()
                transition.type = kCATransitionFade

                super.layer.add(transition, forKey: kCATransition)
                super.image = img

                CATransaction.commit()
            } 
            else {
                super.image = nil
            }
        }
    } 
}

4 Comments

I added this class to a UIImageView and to use that animation but it doesn't use the custom transition. I add images to animationImages and tell the view to startAnimating() but it's not the custom animation. So what am I doing wrong? Thx
Without the code I have no clue what could be the problem. If you can, paste the code you wrote and I will see what's wrong. pastebin.com
I made a new Class with your code and added this to the UIImageView in Interface builder. I added an @IBOutlet weak var slideImageView: FadeImageView!. In my ViewController I try to start the animation using the following code: slideImageView.animationImages = [ UIImage(named: "image1")!, UIImage(named: "image2")!, UIImage(named: "image3")!, UIImage(named: "image4")!] slideImageView.animationDuration = 25.0 slideImageView.startAnimating() I hope this helps...
UIImageView animationImages does not support changing animation. Take a look here, you should use CAKeyframeAnimation for custom animation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.