Things take time

[SWIFT] Embed ViewController(+ View) programmatically 본문

iOS (기능)

[SWIFT] Embed ViewController(+ View) programmatically

겸손할 겸 2019. 1. 21. 11:07

[Embed ViewController]


뷰 컨트롤러를 하위의 객체로포함시키는 것을 Embed!



흔히 이렇게 스토리보드에서 우측 드래그를 통해 Embed를 할경우 이런 표시로 나타난다. 

그러나 만약, embed를 하는 경우가 2가지 이상이라면? 코드로 작성해야 할 것이다.


[코드]

import UIKit

class EmbedController {
    
    public private(set) weak var rootViewController: UIViewController?
    
    public private(set) var controllers = [UIViewController]()
    
    init (rootViewController: UIViewController) {
        self.rootViewController = rootViewController
    }
    
    func append(viewController: UIViewController) {
        if let rootViewController = self.rootViewController {
            controllers.append(viewController)
            rootViewController.addChild(viewController)
            rootViewController.view.addSubview(viewController.view)
        }
    }
    
    deinit {
        if self.rootViewController != nil {
            for controller in controllers {
                controller.view.removeFromSuperview()
                controller.removeFromParent()
            }
            controllers.removeAll()
            self.rootViewController = nil
        }
    }
}

이 소스코드를 이용하여 append해주면 끝



그런데 만약 UIView에 추가해야한다면 어떻게 될 까. 그 UIView에는 제약조건이 걸려있어서 특정 크기만큼에 넣어야하며, 그 들어간 뷰 컨트롤러의 뷰 크기 또한 UIView의 크기를 따라가야한다면(= 상대적인 UI가 나와야한다면)


1. 위의 소스를 가져다 쓰고, child에서 화면의 크기를 재 조정한다.

2. 지정한 View의 Constraint를 지정한 후에 아래의 코드를 사용한다.

addChild(tlkMsgLstMenuContController2) self.certainView.addSubview(childViewController.view) childViewController.view.frame = certainView.bounds childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] childViewController.didMove(toParent: self)

A.didMove(B)

A라는 ChildViewController에게 B라는 ParentViewController에 포함되었으니 Move하라는 의미


frame : 현재 슈퍼 뷰가 있을 경우, 상대적 위치

bounds : 슈퍼 뷰와 상관없이 자신의 위치가 절대적인 위치가 됨




[출처]


https://stackoverflow.com/questions/37370801/how-to-add-a-container-view-programmatically

https://stackoverflow.com/questions/43150320/embed-uiviewcontroller-inside-a-uiview