https://developer.apple.com/documentation/uikit/uinavigationcontroller
"A container view controller that defines a stack-based scheme for navigating hierarchical content."
계층구조의 컨텐트를 네비게이션 동작하기 위한 스택 기반 스킴을 정의하는 컨테이너 뷰 컨트롤러입니다.
@MainActor class UINavigationController : UIViewController
네비게이션 컨트롤러는 네비게이션 인터페이스에서 하나 혹은 하나 이상의 자식 뷰 컨트롤러를 관리하는 컨테이너 뷰 컨트롤러입니다. 이와 같은 타입에서 한 번에 오직 하나의 자식 뷰 컨트롤러만 시각화됩니다. 뷰 컨트롤러에서 아이템을 선택하는 것은 애니메이션을 사용해서 스크린에 새 뷰 컨트롤러를 푸시하고 이전 뷰 컨트롤러를 숨깁니다. 인터페이스 상단에서 네비게이션바에 있는 뒤로가기 버튼을 탭하면 상단 뷰 컨트롤러를 제거하고 아래에 있는 뷰 컨트롤러를 드러냅니다.
앱에 의해 관리되는 계층구조 데이터의 조직을 모방하기 위해 네비게이션 인터페이스를 사용하시기 바랍니다. 계층구조의 각 수준에서 컨텐트를 표시하기 위해 적합한 스크린(커스텀 뷰 컨트롤러에 의해 관리되는)을 제공할 수 있습니다. Figure 1은 iOS 시뮬레이터에서 설정 애플리케이션에 의해 제공된 네비게이션 인터페이스의 예시를 보여줍니다. 첫 번째 스크린은 preference를 포함하는 애플리케이션의 리스트를 사용해 사용자에게 보여줍니다. 애플리케이션을 선택하는 것은 개별 설정 및 해당 애플리케이션에 대한 설정의 그룹을 드러냅니다. 그룹을 선택하면 더 많은 설정을 보여줍니다. 루트 뷰를 제외한 모든 경우 네비게이션 컨트롤러는 사용자가 계층구조의 뒤로 이동할 수 잇도록 뒤로가기 버튼을 제공합니다.
Figure 1 A sample navigation interface
네비게이션 컨트롤러 객체는 네비게이션 스택으로 알려진 순서가 있는 배열을 사용해서 자식 뷰 컨트롤러를 관리합니다. 배열에 있는 첫 번째 뷰 컨트롤러는 루트 뷰 컨트롤러이며, 스택의 하단을 나타냅니다. 배열에 있는 마지막 뷰 컨트롤러는 스택 가장 상단에 있는 아이템이며, 현재 표시되고 있는 뷰 컨트롤러를 나타냅니다. 세그 사용 혹은 이 클래스의 메소드를 사용해서 스택으로부터 뷰 컨트롤러를 추가하거나 제거할 수 있습니다. 사용자는 네비게이션바에 있는 뒤로가기 버튼을 사용하거나 왼쪽 edge 스와이프 제스쳐를 사용해서 가장 상단에 있는 뷰 컨트롤러를 제거할 수도 있습니다.
네비게이션 컨트롤러는 인터페이스 상단에 있는 네비게이션바와 인터페이스의 하단에 있는 선택적 툴바를 관리합니다. 네비게이션바는 항상 제시되며, 자식 뷰 컨트롤러에서 제공하는 컨텐트를 사용하면서 네비게이션바를 업데이트하는 네비게이션 컨트롤러에 의해 관리됩니다. isToolbarHidden
속성이 false
인 경우 네비게이션 컨트롤러는 가장 상단에 있는 뷰 컨트롤러에 의해 제공되는 컨텐츠로 툴바를 업데이트합니다.
네비게이션 컨트롤러는 딜리게이트 객체와 함께 동작을 조정합니다. 딜리게이트 객체는 뷰 컨트롤러의 푸시 혹은 팝을 오버라이드 할 수 있으며, 커스텀 애니메이션 전환을 제공할 수 있고, 네비게이션 인터페이스에 대한 선호하는 orientation을 구체화할 수 있습니다. 제공하는 딜리게이틑 객체는 UINavigationControllerDelegate
프로토콜을 따라야 합니다.
Figure 2는 네비게이션 컨트롤러와 네비게이션 컨트롤러가 관리하는 객체 사이의 관계를 보여줍니다. 이와 같은 객체에 접근하려면 네비게이션 컨트롤러의 특정 속성을 사용하시기 바랍니다.
Figure 2 Objects managed by the navigation controller
네비게이션 컨트롤러는 컨테이너 뷰 컨트롤러입니다. 즉 네비게이션 컨트롤러는 내부에 다른 뷰 컨트롤러의 컨텐트를 끼워넣습니다. 네비게이션 컨트롤러의 뷰 속성으로부터 네비게이션 컨트롤러의 뷰에 접근할 수 있습니다. 이 뷰는 네비게이션바, 선택적 툴바, 가장 상단에 있는 뷰 컨트롤러에 상응하는 컨텐트 뷰를 통합하니다. Figure 3은 이와 같은 뷰들이 전체 네비게이션 인터페이스를 나타내기 위해 어떻게 조합되는지를 보여줍니다. (이 그림에서 네비게이션 인터페이스는 탭바 인터페이스 내부에 추가로 끼워집니다.) 네비게이션바 및 툴바 뷰의 컨텐트가 변경될지라도, 뷰 자체는 변경되지 않습니다. 실제로 변경되는 뷰는 네비게이션 스택에 있는 가장 상단의 뷰 컨트롤러가 제공하는 커스텀 컨텐트 뷰일 뿐입니다.
Figure 3 The views of a navigation controller
Note
컨텐트 뷰는 iOS 7 및 이후 버전에서 네비게이션바 아래에 있기 때문에 뷰 컨트롤러 컨텐트를 디자인할 때 해당 공간을 고려해야 합니다.
네비게이션 컨트롤러는 네비게이션바 및 선택적 네비게이션 툴바의 생성, 설정, 표시를 관리합니다. 네비게이션바의 모양 관련 속성을 커스터마이징하는 것은 허용되지만, 프레임, bounds, 알파 값을 직접 수정하지는 않아야 합니다. UINavigationBar
를 서브클래싱하는 경우 init(navigationBarClass:toolbarClass:)
메소드를 사용해서 네비게이션 컨트롤러를 초기화해야 합니다. 네비게이션바를 숨기거나 나타내려면 isNavigationBarHidden
속서으 혹은 setNavigationBarHidden(_:animated:)
메소드를 사용해야 합니다.
네비게이션 컨트롤러는 네비게이션 스택에 있는 뷰 컨트롤러에 연결된 네비게이션 아이템 객체(UINavigationItem
클래스의 인스턴스)를 사용해서 네비게이션바의 컨텐츠를 동적으로 빌드합니다. 네비게이션바의 전반적 모양을 커스터마이징하려면 UIAppearance
API를 사용할 수 있습니다. 네비게이션바의 컨텐츠를 변경하려면 커스텀 뷰 컨트롤러의 네비게이션 아이템을 설정해야 합니다. 네비게이션 아이템에 대한 더 많은 정보는 UINavigationItem
을 보시기 바랍니다.
UINavigationItem
https://developer.apple.com/documentation/uikit/uinavigationitem
https://velog.io/@panther222128/UINavigationItem
상단 수준 뷰 컨트롤러가 변경될 때마다 네비게이션 컨테이너는 그에 따라 네비게이션바를 업데이트합니다. 구체적으로 네비게이션 컨트롤러는 세 가지 네비게이션 바 위치(왼쪽, 중앙, 오른쪽)에 표시되는 바 버튼 아이템을 업데이트합니다. 바 버튼 아이템은 UIBarButtonItem
클래스의 인스턴스입니다. 커스텀 컨텐트를 갖는 아이템을 생성할 수 있으며, 표준 시스템 아이템을 생성할 수도 있습니다.
네비게이션바의 틴트를 지정하는 것은 네비게이션바 자체의 속성에 의해 제어됩니다. 바에 있는 틴트 색상을 변경하려면 tintColor
속성을 사용할 수 있으며, 바 자체의 틴트 색상을 변경하려면 barTintColor
속성을 사용할 수 있습니다. 네비게이션바는 현재 표시되는 뷰 컨트롤러로부터 틴트 색상을 상속받지 않습니다.
네비게이션바에 대한 더 많은 정보는 UINavigationBar
를 보시기 바랍니다. 바 버튼 아이템 생성 방법에 대한 더 많은 정보는 UIBarButtonItem
을 보시기 바랍니다.
네비게이션 스택에서 루트 뷰 컨트롤러를 제외하고, 네비게이션바의 왼쪽 측면에 있는 아이템은 이전 뷰 컨트롤러로 돌아가는 네비게이션 돌아가기를 제공합니다. 이 왼쪽 버튼의 컨텐츠는 아래 내용에 따라 결정됩니다.
leftBarButtonItem
속성을 설정하시기 바랍니다.backBarButtonItem
속성에서 객체를 갖는 경우 네비게이션바는 해당 아이템을 표시합니다.Note
뒤로가기 버튼의 제목이 사용 가능한 공간에 맞춰지기에 너무 긴 경우 네비게이션 바는 실제 버튼 제목을 "뒤로가기" 스트링으로 대체할 것입니다. 네비게이션바는 이전 뷰 컨트롤러에 의해 뒤로가기 버튼이 제공된 경우에만 설명한 것처럼 합니다. 새로운 상단 수준 뷰 컨트롤러가 커스텀 왼쪽 바 버튼 아이템(네비게이션 아이템의leftBarButtonItem
혹은leftBarButtonItems
속성에 있는 객체)을 갖는 경우 네비게이션바는 버튼 제목을 변경하지 않습니다.
네비게이션 컨트롤러는 네비게이션바의 중앙을 아래처럼 업데이트합니다.
titleView
속성을 설정해야 합니다.네비게이션 컨트롤러는 네비게이션바의 오른쪽 측면을 아래처럼 업데이트합니다.
rightBarButtonItem
속성을 설정하시기 바랍니다.네비게이션 컨트롤러 객체는 뷰 계층구조에서 선택적 툴바를 관리합니다. 표시될 때 이 툴바는 활성화된 뷰 컨트롤러의 toolbarItems
속성으로부터 아이템의 현재 집합을 가져옵니다. 활성화된 뷰 컨트롤러가 변경되면 네비게이션 컨트롤러는 새 아이템을 적한한 시점에 위치시키는 애니메이션 처리를 하면서 새 뷰 컨트롤러에 일치할 수 있도록 툴바 아이템을 업데이트합니다.
네비게이션 툴바는 기본값으로 숨겨지지만 네비게이션 컨트롤러 객체의 setToolbarHidden(_:animated:)
메소드를 호출해서 네비게이션 인터페이스에 나타나도록 할 수 있습니다. 모든 뷰 컨트롤러가 툴바 아이템을 지원하지는 않는 경우 딜리게이트 객체는 이어지는 푸시 및 팝 동작 동안 툴바의 시각화를 토글하기 위해 이 메소드를 호출할 수 있습니다. 커스텀 UIToolbar
서브클래스를 사용하려면 init(navigationBarClass:toolbarClass:)
메소드를 사용해서 네비게이션 컨트롤러를 초기화해야 합니다. 네비게이션 컨트롤러 생성을 위해 커스텀 툴바 및 네비게이션 바 서브클래스를 사용하는 경우 네비게이션 컨트롤러를 스크린에 나타내기 전에 뷰 컨트롤러들을 푸시하고 설정해야 합니다.
네비게이션 인터페이스는 수평 compact와 수평 regular 환경에서 같습니다. 두 환경 사이에서 토글하는 경우 네비게이션 컨트롤러 뷰의 크기만 변경됩니다. 네비게이션 컨트롤러는 뷰 계층구조 혹은 뷰의 레이아웃을 변경하지 않습니다.
네비게이션 스택에서 뷰 컨트롤러 사이에 세그를 설정하는 경우 표준 Show와 Show Detail 세그는 아래처럼 동작합니다.
다른 세그 타입의 동작은 변경되지 않습니다.
네비게이션 컨트롤러는 인터페이스에서 아래 동작을 지원합니다.
navigationControllerSupportedInterfaceOrientations(_:)
메소드를 사용해서 지원되는 orientation의 다른 집합을 구체화할 수 있습니다.UIModalPresentationStyle.currentContext
혹은 UIModalPresentationStyle.overCurrentContext
인 경우 네비게이션 스택에 있는 뷰 컨트롤러부터의 모달 프리젠테이션은 전체 네비게이션 인터페이스를 덮습니다.네비게이션 컨트롤러의 restorationIdentifier
속성에 값을 할당하는 경우 네비게이션 컨트롤러와 네비게이션 스택에 있는 자식 뷰 컨트롤러의 보존을 시도합니다. 네비게이션 컨트롤러는 스택의 하단에서 시작하고 위로 움직이며, 유효한 복구 아이덴티파이어 스트링을 갖는 각 뷰 컨트롤러를 인코딩합니다. 다음 launch 주기 동안 네비게이션 컨트롤러는 보존되었던 것과 같은 순서로 네비게이션 스택으로 뷰보존된 뷰 컨트롤러를 복구합니다.
네비게이션 스택에 푸시한 자식 뷰 컨트롤러는 같은 복구 아이덴티파이어를 사용할 것입니다. 네비게이션 컨트롤러는 해당 자식의 복구 경로가 고유함을 보장할 수 있도록 추가적인 정보를 자동으로 저장합니다.
상태 보존 및 복구 작동 방식에 대한 더 많은 정보는 Preserving Your App's UI Across Launches를 보시기 바랍니다.
Preserving Your App's UI Across Launches
https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches
https://velog.io/@panther222128/Preserving-Your-Apps-UI-Across-Launches