스토리 보드 "컨테이너보기"는 표준 UIView
개체 일뿐 입니다. 특별한 "컨테이너보기"유형은 없습니다. 실제로 뷰 계층 구조를 보면 "컨테이너 뷰"가 표준임을 알 수 있습니다 UIView
.
이를 프로그래밍 방식으로 달성하려면 "뷰 컨트롤러 포함"을 사용합니다.
instantiateViewController(withIdentifier:)
스토리 보드 개체를 호출하여 자식 뷰 컨트롤러를 인스턴스화 합니다.
addChild
부모 뷰 컨트롤러를 호출 하십시오.
- 뷰 컨트롤러
view
를 뷰 계층 구조에 추가하고 또는 제약 조건을 적절하게 addSubview
설정하십시오 frame
.
didMove(toParent:)
자식보기 컨트롤러 에서 메서드를 호출하여 부모보기 컨트롤러에 대한 참조를 전달합니다.
보기 컨테이너보기 컨트롤러를 구현 에 Programming Guide를보기 컨트롤러 와의 섹션 "컨테이너 뷰 컨트롤러 구현" 의 UIViewController 클래스 참조 .
예를 들어, Swift 4.2에서는 다음과 같이 보일 수 있습니다.
override func viewDidLoad() {
super.viewDidLoad()
let controller = storyboard!.instantiateViewController(withIdentifier: "Second")
addChild(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(controller.view)
NSLayoutConstraint.activate([
controller.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
controller.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
controller.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
controller.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10)
])
controller.didMove(toParent: self)
}
위의 내용은 실제로 계층 구조에 "컨테이너보기"를 추가하지 않습니다. 그렇게하려면 다음과 같이하면됩니다.
override func viewDidLoad() {
super.viewDidLoad()
// add container
let containerView = UIView()
containerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(containerView)
NSLayoutConstraint.activate([
containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
containerView.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10),
])
// add child view controller view to container
let controller = storyboard!.instantiateViewController(withIdentifier: "Second")
addChild(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(controller.view)
NSLayoutConstraint.activate([
controller.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
controller.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
controller.view.topAnchor.constraint(equalTo: containerView.topAnchor),
controller.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
])
controller.didMove(toParent: self)
}
이 후자의 패턴은 서로 다른 자식보기 컨트롤러간에 전환 할 때 매우 유용하며 한 자식의보기가 동일한 위치와 이전 자식보기에 있는지 확인하려는 경우 (즉, 배치에 대한 모든 고유 한 제약 조건은 컨테이너보기에 의해 결정됩니다. 매번 이러한 제약 조건을 재 구축 할 필요가 없습니다). 그러나 단순한보기 포함 만 수행하는 경우이 별도의 컨테이너보기에 대한 필요성은 덜 매력적입니다.
위의 예에서, 내가하고 있어요 translatesAutosizingMaskIntoConstraints
에 false
제약 자신을 정의. 당신은 분명히 떠날 수 translatesAutosizingMaskIntoConstraints
로 true
하고 모두 설정 frame
하고를 autosizingMask
원하는 경우 표시 추가,보기에.
Swift 3 및 Swift 2 변환에 대한이 답변의 이전 개정판을 참조하십시오 .