swiftuiviewcontrollerprogrammatically-created

How to create view controller that covers half the screen programmatically SWIFT


I am trying to create a view similar to Facebook so that when you click a button, a view controller covers half the sceeen like this:half view

And then if you swipe up it covers the whole view like this:

full view

How would I go about doing this?


Solution

  • you should use an container view , and set frame of container view half of the screen height . but you can just use container view in object library xcode. container view is look like view use in your view controller class bellow the class name add this code :

      class YourViewController: UIViewController {
      // MARK: Properties
      let containerView = UIView() 
    

    in your viewDidLayoutSubviews() function you should set frame of container view like this :

    override func viewWillLayoutSubviews() {
    containerView.frame = CGRect(x: 0, y: self.view.frame.midY, width: self.view.frame.width, height: self.view.frame.height / 2)
     let yourSecondViewController = YourSecondViewController()
        addContentContainerView(yourSecondViewController)
    } 
    

    now you have a container view that cover half of the screen, then you should add your second view controller to your container view , so you should create a second view controller class programmatically , or you should create a view controller in your xcode storyboard and set storyboard id for that.

    for add and remove a child view controller in an container view you can use this functions:

        private func addContentContainerView(_ childViewController: UIViewController) {
    
    
        childViewController.willMove(toParentViewController: self)
        containerView.addSubview(childViewController.view)
    
        self.addChildViewController(childViewController)
        childViewController.didMove(toParentViewController: self)
    
    }
    private func removeContentContainerView(_ childViewController: UIViewController) {
        childViewController.didMove(toParentViewController: nil)
        childViewController.view.removeFromSuperview()
        childViewController.removeFromParentViewController()
    
    
    }
    

    then you should add your second view controller to your container view with private func addContentContainerView(_ childViewController: UIViewController)

    if you make the second programmatically and set you should use this code for use add that in your container in your viewWillLayoutSubviews method like this:

    override func viewWillLayoutSubviews() {
    containerView.frame = CGRect(x: 0, y: self.view.frame.midY, width:      self.view.frame.width, height: self.view.frame.height / 2)
    let yourSecondViewController = YourSecondViewController()
    addContentContainerView(yourSecondViewController)
    } 
    

    but if you make your second view controller in storyboard you should set id for that , select view controller then select identity inspector below identity set Storyboard ID : SecondViewController then instead last viewWillLayoutSubwies , your viewWillLayoutSubviews should like this:

    override func viewWillLayoutSubviews() {
    containerView.frame = CGRect(x: 0, y: self.view.frame.midY, width:      self.view.frame.width, height: self.view.frame.height / 2)
     let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
      let yourSecondViewController = mainStoryBoard.instantiateViewController(withIdentifier: "SecondViewController")
    addContentContainerView(yourSecondViewController)
    
    } 
    

    and for scroll that you should add a UIScrollView and set height of that to self.view.frame.height * 1.5