title: How to present a ViewController on Half screen
body: <p>I have a <code>UIViewController</code> which have only a <code>UIView</code> which covers 1/3 of the viewController from bottom.  Like this</p>
  
  <p><a href="https://i.stack.imgur.com/iiA4c.png" rel="noreferrer"><img src="https://i.stack.imgur.com/iiA4c.png" alt="enter image description here"></a></p>
  
  <p>I want to present this viewController on an other ViewController. It should appear from bottom animated and it should dismiss to the bottom animated.</p>
  
  <p>But I do not want it to cover the whole Screen. The viewController on which it is presented should be visible in the back.</p>
  
  <p>It seems like a basic question But I am unable to get it done. Can someone please point me to the direction ?</p>
  
  <p><strong>Edit:</strong></p>
  
  <p>This is what I have tried so Far. I have  created these classes</p>
  
  <pre><code>// MARK: -
  
  class MyFadeInFadeOutTransitioning: NSObject, UIViewControllerTransitioningDelegate {
  var backgroundColorAlpha: CGFloat = 0.5
  var shoulDismiss = false
  
  func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -&gt; UIViewControllerAnimatedTransitioning? {
  
      let fadeInPresentAnimationController = MyFadeInPresentAnimationController()
          fadeInPresentAnimationController.backgroundColorAlpha = backgroundColorAlpha
  
      return fadeInPresentAnimationController
  }
  
  func animationController(forDismissed dismissed: UIViewController) -&gt; UIViewControllerAnimatedTransitioning? {
  
      let fadeOutDismissAnimationController = MyFadeOutDismissAnimationController()
  
      return fadeOutDismissAnimationController
  }
  
  }
  
  // MARK: -
  
  class MYFadeInPresentAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
  
  let kPresentationDuration = 0.5
  var backgroundColorAlpha: CGFloat?
  
  func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -&gt; TimeInterval {
      return kPresentationDuration
  }
  
  func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
      let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
  
      toViewController.view.backgroundColor = UIColor.clear
  
      let toViewFrame = transitionContext.finalFrame(for: toViewController)
      let containerView = transitionContext.containerView
  
      if let pickerContainerView = toViewController.view.viewWithTag(kContainerViewTag) {
          let transform = CGAffineTransform(translationX: 0.0, y: pickerContainerView.frame.size.height)
          pickerContainerView.transform = transform
      }
  
      toViewController.view.frame = toViewFrame
      containerView.addSubview(toViewController.view)
  
      UIView.animate(withDuration: 0.3, delay: 0.0, options: .curveLinear , animations: {
          toViewController.view.backgroundColor = UIColor(white: 0.0, alpha: self.backgroundColorAlpha!)
  
          if let pickerContainerView = toViewController.view.viewWithTag(kContainerViewTag) {
              pickerContainerView.transform = CGAffineTransform.identity
          }
  
      }) { (finished) in
          transitionContext.completeTransition(true)
      }
  }
  
  }
  
  // MARK: -
  
  class MYFadeOutDismissAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
  let kDismissalDuration = 0.15
  
  func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -&gt; TimeInterval {
      return kDismissalDuration
  }
  
  func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
      let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
      let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
      let containerView = transitionContext.containerView
  
      containerView.addSubview(toViewController.view)
      containerView.sendSubview(toBack: toViewController.view)
  
      UIView.animate(withDuration: kDismissalDuration, delay: 0.0, options: .curveLinear, animations: {
          //            fromViewController.view.backgroundColor = UIColor.clearColor()
          //            if let pickerContainerView = toViewController.view.viewWithTag(kContainerViewTag) {
          //                let transform = CGAffineTransformMakeTranslation(0.0, pickerContainerView.frame.size.height)
          //                pickerContainerView.transform = transform
          //            }
          fromViewController.view.alpha = 0.0
  
      }) { (finished) in
          let canceled: Bool = transitionContext.transitionWasCancelled
          transitionContext.completeTransition(true)
  
          if !canceled {
              UIApplication.shared.keyWindow?.addSubview(toViewController.view)
          }
      }
  }
  
  }
  </code></pre>
  
  <p>And in the viewController which is being presented, I am doing as follows</p>
  
  <pre><code>var customTransitioningDelegate: MYFadeInFadeOutTransitioning? = MYFadeInFadeOutTransitioning()
  
      init() {
      super.init(nibName: "SomeNibName", bundle: Bundle.main)
      transitioningDelegate = customTransitioningDelegate
      modalPresentationStyle = .custom
  
      customTransitioningDelegate?.backgroundColorAlpha = 0.0
  } 
  </code></pre>
  
  <p>It do present the viewController and I can see the background viewController as well. But I want it to be presented from bottom with animation. And dismiss to bottom with animation. How can I do that ?</p>