Chris Byatt Chris Byatt - 5 months ago 49
iOS Question

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)
})
}
}
}

Answer

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

Comments