Search code examples
iosswiftanimationsegue

Custom Fade Segue not animating if I present the destinationViewController


I've written a custom segue to get a fade effect, which i'm trying to achieve by inserting the destination view controller below the source view controller and animating the alpha of the source view controller to zero.

However, adding the destination view controller below the source seems to cancel the animation and the segue performs as if it is a regular present with animation disabled.

import UIKit

class FadeSegue: UIStoryboardSegue {

    override func perform() {
        // Get the view of the source
        let sourceViewControllerView = self.sourceViewController.view
        // Get the view of the destination
        let destinationViewControllerView = self.destinationViewController.view

        let screenWidth = UIScreen.mainScreen().bounds.size.width
        let screenHeight = UIScreen.mainScreen().bounds.size.height

        // Make the destination view the size of the screen
        destinationViewControllerView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)

        if let window = UIApplication.sharedApplication().keyWindow {
            // Insert destination below the source
            // Without this line the animation works but the transition is not smooth as it jumps from white to the new view controller
            window.insertSubview(destinationViewControllerView, belowSubview: sourceViewControllerView)

            // Animate the fade, remove the destination view on completion and present the full view controller
            UIView.animateWithDuration(0.4, animations: {
                sourceViewControllerView.alpha = 0.0
                }, completion: { (finished) in
                    destinationViewControllerView.removeFromSuperview()
                    self.sourceViewController.presentViewController(self.destinationViewController, animated: false, completion: nil)
            })
        }
    }
}

Solution

  • Hello I think that what you need is this

    override func perform() {
            // Get the view of the source
            let sourceViewControllerView = self.sourceViewController.view
            // Get the view of the destination
            let destinationViewControllerView = self.destinationViewController.view
    
            let screenWidth = UIScreen.mainScreen().bounds.size.width
            let screenHeight = UIScreen.mainScreen().bounds.size.height
    
            // Make the destination view the size of the screen
            destinationViewControllerView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
    
                // Insert destination below the source
                // Without this line the animation works but the transition is not smooth as it jumps from white to the new view controller
                destinationViewControllerView.alpha = 0;
                sourceViewControllerView.addSubview(destinationViewControllerView);
                // Animate the fade, remove the destination view on completion and present the full view controller
                UIView.animateWithDuration(10, animations: {
                    destinationViewControllerView.alpha = 1;
                    }, completion: { (finished) in
                        destinationViewControllerView.removeFromSuperview()
                        self.sourceViewController.presentViewController(self.destinationViewController, animated: false, completion: nil)
                })
            }
        }
    

    I Hope this help you