-
[iOS] Container View Controller λ?iOS/π€ App 2021. 7. 26. 18:09
1μ°¨ μμ : 21.09.30
μλ νμΈμ πΆ
μ΄λ² μκ°μλ ViewController μ μ’ λ₯ μ€ νλμΈ
Container View Controller μ λν΄μ 곡λΆν΄λ³΄κ² μ΅λλ€.
κ·ΈλΌ μμν κ²μπ₯
μ°μ View Controller λ₯Ό μν λ‘ κ΅¬λΆνμλ©΄ ν¬κ² λ κ°μ§ μ’ λ₯κ° μμ΅λλ€!
첫λ²μ§Έλ Content View Controller λ‘μ,
κΈ°λ³Έμ μΌλ‘ λ·° 컨νΈλ‘€λ¬μκ² κΈ°λνλ μν ( μ± λ΄ λ°μ΄ν°λ₯Ό νλ©΄μ 보μ¬μ£Όλ λ±) μ μννλ λ·° 컨νΈλ‘€λ¬μ λλ€.
μΌλ°μ μΌλ‘ UIViewController λ₯Ό μ§μ μλΈν΄λμ±νμ¬ μ»€μ€ν ν΄μ μ¬μ©νλ κ²½μ°μ λλ€.
class MyHomeViewController: UiViewController { ... }
λλ²μ§Έλ μ΄λ² μκ°μ λ€λ£° Container View Controller λ‘μ,
μ¬λ¬ μμλ₯Ό μ‘°ν©ν μΈν°νμ΄μ€λ₯Ό ꡬμ±νκ³ ( composite interface )
λ³΄ν΅ μ§μ 무μΈκ°λ₯Ό 보μ¬μ£Όλ μν μ μμΌλ©°,
λ·° 컨νΈλ‘€λ¬ κ°μ λΆλͺ¨-μμ κ΄κ³λ₯Ό νμ±νμ¬ μμ λ§μ λ°©μμΌλ‘ μμμ κ΄λ¦¬νλ μν μ 맑λ λ·° 컨νΈλ‘€λ¬ μ λλ€.
κ°λ¨νκ² μκ°ν΄λ³΄λ©΄, Container View Controller λ€μ΄ Content View Controller λ€μ κ΄λ¦¬νλ€κ³ μκ°νλ©΄ λκ² λ€μ!
κ·Έλ°λ° μ΄λ―Έ UIKit μμ κΈ°λ³Έμ μΌλ‘ μ 곡νλ System Container View Controller λ€μ΄ μμ΅λλ€.
UITabBarController, UINavigationController, UIPageViewController λ±μ΄ κ·Έκ²λ€μ λλ€.
μ΄ λ Contianer View Controller λ€μ νΉμ§μ΄ μμ΅λλ€.
μμ View Controller λ€μ μ°Έμ‘°λ₯Ό κ°μ§κ³ κ΄λ¦¬νλ€λ κ²μΈλ°μ.
λ³΄ν΅ μλμ κ°μ λ°©μμΌλ‘ μμ 뷰컨νΈλ‘€λ¬μ μ κ·Όν μ μκ³ , μμ κ΄κ³λ₯Ό μλ‘ μ€μ ν΄ μ€μλ μμ΅λλ€.
κ·Έλ°λ° μ κ΅³μ΄ μ΄λ° λΆλͺ¨-μμ κ΄κ³λ₯Ό λ§λ€μ΄μ κ΄λ¦¬ν΄μ£Όλμ§μ λν μλ¬Έμ΄ μκΉλλ€.
컨ν μ΄λλ μ νμν κ±ΈκΉμ?
Container View Controller λ μ νμν κΉ?
π’ Navigation λ‘μ§ (λΌμ°ν ) μ λΆλ¦¬νμ¬ λ¨μΌ μ± μμμΉμ μ§ν€λ €λ μλμ΄λ€.
" promote better encapsulation by separating out your content
from how you display that content onscreen"
MVC ν¨ν΄μ 곡λΆν λ
λ무λ무 λ§μ΄ λ€μ΄λ΄€μ Massive View Cotroller μ λν΄ μμ€κ±°λΌκ³ μκ°ν©λλ€.
κ°λ¨νκ² λ·° 컨νΈλ‘€λ¬κ° λ무 λ§μ μν (μ± μ)μ νκ³ μλ€λ κ²μΈλ°, λ€μκ³Ό κ°μ μ½λλ₯Ό νλ² λ³Όκ²μ.
func showChildVC() { // λ·° 컨νΈλ‘€λ¬λ₯Ό μ§μ μμ±νλ€ let childVC = ChildViewController() // μ§μ μμ‘΄μ± μ£Όμ λ ν΄μ€λ€ childVC.someDedendency = SomeDependency() // μ§μ νλ©΄μ νμλ ν΄μ€λ€ present(childVC, animated: true, completion: nil) }
μ μ½λλ μ무 λ¬Έμ κ° μλ€κ³ μκ°ν μ μμ§λ§, μ΄ λ©μλ μμμλ λ·° 컨νΈλ‘€λ¬λ λ§μ μ± μμ κ°μ§κ³ μμ΅λλ€.
1. λ·° 컨νΈλ‘€λ¬λ₯Ό μ§μ μμ±νμ¬ μλͺ μ£ΌκΈ°μ κ΄λ €νκ³
2. μμ‘΄μ±μ μ£Όμ ν΄μ£Όκ³
3. νλ©΄μ λμμ£Όλ μν κΉμ§
μ± μμ΄ λ§μΌλ©΄ μ μ§λ³΄μμ ν μ€νΈκ° νλ€μ΄μ§λλ€.
λ°λΌμ νλ©΄μ νμν΄μ£Όλ μ± μμ λ€λ₯Έ κ°μ²΄λ‘ λΆλ¦¬ν΄ λΈ κ²μ΄ 컨ν μ΄λ λ·° 컨νΈλ‘€λ¬μ λλ€.
μμ€ν 컨ν μ΄λ λ·° 컨νΈλ‘€λ¬ μ€ νλμΈ
Navigation Controller λ₯Ό μλ‘ λ€λ©΄
컨ν μ΄λ λ·° 컨νΈλ‘€λ¬κ° μμ λ·° 컨νΈλ‘€λ¬μ λν νλ©΄ μ νμ μ΄λ€ λ°©μμΌλ‘ νλμ§ λ³Ό μ μμ΅λλ€.
@IBAction func pushSecond(_ sender: Any) { /* μ¬κΈ°λ secondVC λ₯Ό μμ±νλ μ½λκ° λ€μ΄κ°λλ€ */ // μ§μ λ€μ νλ©΄μ νμνμ§ μκ³ , navigationController μ μμ‘΄νλ€ navigationController?.pushViewController(secondVC, animated: true) }
present(_:animated:completion:) κ³Ό κ°μ νλ©΄ μ²λ¦¬ λ©μλλ₯Ό μ§μ νΈμΆνμ§ μκ³ ,
navigationController μκ² νλ©΄μ νμν VCλ₯Ό μ λ¬νμ¬ νΈλμ§μ κ³Ό νλ©΄ νμλ₯Ό λ§‘κΈ°κ³ (μμ‘΄νκ³ ) μμ΅λλ€.
pushViewController(_:animated:) 보λ€λ μ λ show(_:sender:) λ₯Ό μ’μνλλ°μ...
μ’ λ μΆμνλ λ©μλλΌκ³ 보μλ©΄ λκ³ , μμΈν λμμ λ¬Έμλ₯Ό μ°Ύμ보μλ©΄ μ’μ κ² κ°μ΅λλ€.
μλ¬΄νΌ μ λ μ λ° λ°©μμ΄ μλ²½νλ€κ³ μκ°νμ§λ μμ΅λλ€.
μ¬μ ν λ·° 컨νΈλ‘€λ¬λ₯Ό μ§μ μμ±νκ³ , μμ‘΄μ± μ£Όμ λ ν΄μ£Όλ μ½λκ° νμνλκΉμ.
π£ λ·° μ체μ ꡬμμ λΆλ¦¬νμ¬ μ μ§λ³΄μκ° μ©μ΄ν΄μ§λ€.
컨ν μ΄λ 뷰컨μ λ£¨νΈ λ·°λ₯Ό λͺ κ°μ ꡬμμΌλ‘ λλμ΄
ꡬμλ³λ‘ νΉμ±μ λ§κ² κ°κ°μ λ·° 컨νΈλ‘€λ¬λ₯Ό λκ³ λ°λ‘ κ΄λ¦¬νλ©΄
μ± μλ λΆλ¦¬λκ³ μ μ§λ³΄μλ μ’ λ μ¬μ μ§ κ²μ λλ€.
μμ μ΄λ―Έμ§λ UIKit μ΄ μ 곡νλ UISplitViewController λ‘μ
λ£¨νΈ λ·°λ₯Ό μΌμͺ½κ³Ό μ€λ₯Έμͺ½ λκ°μ ꡬμμΌλ‘ λλμ΄ κ΅¬μλ³λ‘
λ€λ₯Έ μ± μμ κ°μ§λ μμ 뷰컨νΈλ‘€λ¬λ€μ κ΄λ¦¬ν©λλ€.
μμ΄ν¨λμμ μ½κ² λ³Ό μμλ UI ꡬμ±μΈλ°, λ³΄ν΅ μΌμͺ½μ Table VC, μ€λ₯Έμͺ½μ Content VC κ° λ€μ΄κ°λ κ² μμ£Ό λ³΄μ ¨μ£ ?
UIContainerViewController κ° κ³΅μλ¬Έμμ μμ΄μ π€
μ ν 곡μλ¬Έμμμ μ°Ύμ보면 μμκ² μ§λ§, UIContainerViewController μ κ°μ ν΄λμ€λ μμ΅λλ€.
Container View Controller λ νλμ κ°λ μ΄λ©°, κΈ°μ‘΄μ μ‘΄μ¬νλ ν΄λμ€λ€μ μ΄μ©ν΄μ 컀μ€ν ꡬνν΄μΌ ν©λλ€.
UIViewController λ₯Ό μλΈν΄λμ±νμ¬ μ¬μ©ν μ μμ΅λλ€.
" A custom UIViewController subclass can also act as a container view controller. "
λ§μ½ 컀μ€ν νμ§ μκ³ μ½κ² μ¬μ©νκ³ μΆλ€λ©΄,
UINavigationController, UITabBarControler μ κ°μ΄ System Container View Controller λ₯Ό μ¬μ©ν΄μΌν©λλ€.
μ΄ ν΄λμ€λ€μ ν΄λμ€λ§μ λ°©μλλ‘ νμ λ·° 컨νΈλ‘€λ¬λ€μ κ΄λ¦¬ν©λλ€.
κ° μ»¨ν μ΄λ VC λ€μ νΉμ±λ€μ μ΄ν΄νκ³ μ©λμ λ§κ² μ¬μ©νλ©΄ λ©λλ€.
컀μ€ν 컨ν μ΄λ λ·° 컨νΈλ‘€λ¬μ μΈν°νμ΄μ€λ₯Ό ꡬμ±νλ κ²μ 컀μ€ν νλ μ¬λμ λͺ«μ λλ€.
μλ₯Ό λ€μ΄ μμ λ·° 컨νΈλ‘€λ¬μ νλ©΄μ κ·Έλλ‘ λ³΄μ¬μ€ μλ μκ³ ,
μνλ λ μ΄μμμ μ€μ ν΄μ 보μ¬μ€μλ μκ³ ( μλ₯Ό λ€μ΄ νλ©΄ λ°λ°)
νΉμ 미리 ꡬνλ container view λ₯Ό μ¬μ©ν΄λ³Ό μλ μμ΅λλ€.
Container View λ λ λκ°μ
" A container view is a proxy view that stands in for the content of a child view controller. "
컨ν μ΄λ λ·°λ μΈν°νμ΄μ€ λΉλμμλ§ μΆκ°ν μ μλ μΌμ’ μ νλ‘μ λ·°μ λλ€.
μλ μ¬μ§μ 보μλ©΄
μΌμͺ½μ μ¬μ μΆκ°ν Container View λ
κΈ°μ‘΄ VC μ μλ‘μ΄ μ€λ₯Έμͺ½μ VC λ‘ μ΄μ΄μ§ Embed Segue λ‘μ μ°κ²°μ ν΅νμ¬ μ»¨ν μΈ λ₯Ό νμν©λλ€.
κ·Έλμ λ§μ½ μΌμͺ½ VC μ°Έμ‘° μ»μΌλ €λ©΄ prepare(forSegue:~) μμ μ λ¬ν΄μΌν¨
μ¦ μΌμͺ½μ Container View μμμ μ€λ₯Έμͺ½μ VC μ λ·° κ³μΈ΅μ 보μ¬μ£Όλ κ²μ΄μ£ !
μλ 곡μλ¬Έμλ μμ;;;;;;;;;;
Custom Container View Controller ꡬν
κΈ°λ³Έμ μΈ μ»¨ν μ΄λ λ·° 컨νΈλ‘€λ¬μ λμμ μννλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
μ£ΌμμΌλ‘ μ€λͺ μ 첨λΆνμμ΅λλ€.
// νμ¬μ λ·° 컨νΈλ‘€λ¬μ μμ λ·° 컨νΈλ‘€λ¬λ₯Ό μΆκ°νλ μ½λ let storyboard = UIStoryboard(name: "Main", bundle: .main) if let viewController = storyboard.instantiateViewController(identifier: "imageViewController") as? ImageViewController { // ν΅μ¬ λ©μλλ‘μ, λ·° 컨νΈλ‘€λ¬μ λΆλͺ¨-μμ κ΄κ³λ₯Ό νμ±νλ€ addChild(viewController) // μμ λ·° 컨νΈλ‘€λ¬μ λ£¨νΈ λ·°λ₯Ό νμ¬ λ·°μ λ·° κ³μΈ΅μ μΆκ°νλ μ½λ view.addSubview(viewController.view) // μ μ½ μμ± onscreenConstraints = configureConstraintsForContainedView(containedView: viewController.view, stage: .onscreen) NSLayoutConstraint.activate(onscreenConstraints) // νλ©΄ μ νμ΄ μλ£λμλ€λ©΄ μμ λ·° 컨νΈλ‘€λ¬μ λ©μλλ₯Ό νΈμΆνμ¬ μλ €μ€λ€. viewController.didMove(toParent: self) }
μ΄ λΆλΆμ λν μμΈν λ΄μ©μ μλ 첨λΆλ λ§ν¬λ₯Ό νμΈν΄λ³΄λ©΄ λ©λλ€
λ!
μ°Έκ³ μλ£: https://developer.apple.com/documentation/uikit/view_controllers/creating_a_custom_container_view_controller/
'iOS > π€ App' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[SSAC μΉ] iOS κ°λ°μ λ°λ·κ³Όμ ν©κ²© νκΈ° (2021) (2) 2021.09.24 [iOS] Safe Area μ Layout Margins μ΄λ? (3) 2021.08.10 [iOS] 리μ€ν°λ μ²΄μΈ (Responder Chain) μ΄λ? (feat. UIResponder, First Responder, UIEvent) (2) 2021.07.12 [iOS] μλμ°λ? (feat. UIWindow) (0) 2021.07.05 [iOS] Core Animation μ΄λ? (2) (0) 2021.07.05