Tuesday, 26 November 2019

Custom VC Transition not Dismissing Properly

I am trying to recreate the stock UIAlertAction in a VC with a custom transition. I currently have the presenting working perfectly(backgroundView fades in and the 'notification' VC slides from the bottom). The problem I am facing is when I dismiss the VC the backgroundView doesn't fade out. It's as if it's completely bypassing my animation block. Once completeTransition is called the backgroundView disappears completely. What is happening?

class AnimationController: NSObject {
 let backgroundView = UIView()
}

extension AnimationController:  UIViewControllerAnimatedTransitioning {
  func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    let containerView = transitionContext.containerView

    guard let toViewController = transitionContext.viewController(forKey: .to),
        let fromViewController = transitionContext.viewController(forKey: .from) else {
            transitionContext.completeTransition(false)
        return
    }
    switch animationType {
    case .present:
        backgroundView.frame = CGRect(x: 0, y: 0, width: toViewController.view.frame.width, height: fromViewController.view.frame.height)
        backgroundView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
        backgroundView.alpha = 0
        containerView.addSubview(backgroundView)

        let viewToAnimate = toViewController.view!
        containerView.addSubview(viewToAnimate)

        toViewController.view.clipsToBounds = true

        viewToAnimate.frame = CGRect(x: 0, y: viewToAnimate.frame.maxY, width: viewToAnimate.frame.width, height: viewToAnimate.frame.height)

        let duration = transitionDuration(using: transitionContext)

        UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 0.80, initialSpringVelocity: 0.1, options: .curveEaseInOut, animations:  {
            self.backgroundView.alpha = 1.0
            viewToAnimate.transform = CGAffineTransform(translationX: 0, y: -viewToAnimate.frame.height)
        }) { _ in
            transitionContext.completeTransition(true)
        }
    case .dismiss:

        containerView.addSubview(fromViewController.view!)

        let testView = fromViewController.view!

        backgroundView.frame = CGRect(x: 0, y: 0, width: testView.frame.width, height: testView.frame.height)
        backgroundView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)

        let duration = transitionDuration(using: transitionContext)

        UIView.animate(withDuration: duration, delay: 0, usingSpringWithDamping: 0.80, initialSpringVelocity: 0.1, options: .curveEaseInOut, animations:  {
            self.backgroundView.alpha = 0.0
            testView.transform = CGAffineTransform(translationX: 0, y: testView.frame.height)
            print("backgroundView Doesn't fade out")
        }) { _ in
            print("backgroundView disappears here")
            transitionContext.completeTransition(true)
        }
    }
}


from Custom VC Transition not Dismissing Properly

No comments:

Post a Comment