-
[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