Linus Bicker
Linus Bicker

Reputation: 129

Swift, newbie question related to containerView. how to make Storyboard viewcontroller for child the same size as a container view

I've been trying to correctly implement a ContainerView in my practice app after watching and reading various tutorials. I initially tried creating the child by utilizing the storyboard and dragging the ContainerView onto the ViewController in question, and then utilizing the child ViewController that is then automatically created, but I need to have multiple child ViewControllers and I couldn't quite figure that out. I researched some programatic ways to do it and I successfully have it functioning the way I want. The only hiccup being that when I am viewing the child ViewControllers on my storyboard they are full size and do not correlate in size to my ContainerView. So I have to have a bit of trial and error in getting the objects I place in the child to fit in the ContainerView.

Can anyone give me some pointers on how I fix that? I've used the code below. The function runs when a button on the parent ViewController is touched. There are other associated child ViewControllers: child2, child3 that run depending on which button is pushed. I didn't include that extra code below for the sake of being concise.

private lazy var child1: PersonInfoChildView1Controller = {
    
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    var viewController = storyboard.instantiateViewController(withIdentifier: "Child1VC") as! PersonInfoChildView1Controller

    viewController.person = self.person
    
    addChild(viewController)
    
    return viewController
}()



//MARK: ADD THE CHILD
private func add(asChildViewController viewController: UIViewController) {

    containerView.addSubview(viewController.view)
    
    // Configure Child View
    viewController.view.frame = containerView.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
 
    // Notify Child View Controller
    viewController.didMove(toParent: self)

}

Upvotes: 1

Views: 108

Answers (2)

Also you can create an extension to UIView class to pin the view to the parent view by just one line code

extension UIView {
    func pin(to superview: UIView){
        translatesAutoresizingMaskIntoConstraints = false
        topAnchor.constraint(equalTo: superview.topAnchor).isActive = true
        leadingAnchor.constraint(equalTo: superview.leadingAnchor).isActive = true
        trailingAnchor.constraint(equalTo: superview.trailingAnchor).isActive = true
        bottomAnchor.constraint(equalTo: superview.bottomAnchor).isActive = true
    }
}

put this in a separate swift file with this method you can make the container view same size as the view controller

containerView.addSubview(viewController.view)
viewController.view.pin(containerView)

This will save you a lot of time in the future.

Upvotes: 1

lpizzinidev
lpizzinidev

Reputation: 13289

Try to set your child view controller constraints relative to the container view.

Edit your add method like this:

private func add(asChildViewController viewController: UIViewController) 
{
    viewController.view.translatesAutoresizingMaskIntoConstraints = false
    containerView.addSubview(viewController.view)
    
    viewController.view.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
    viewController.view.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
    viewController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
    viewController.view.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true

    // Notify Child View Controller
    viewController.didMove(toParent: self)

}

Upvotes: 1

Related Questions