https://developer.apple.com/documentation/uikit/uitabbarcontroller
"A container view controller that manages a multiselection interface, where the selection determines which child view controller to display."
선택이 어떤 자식 뷰 컨트롤러를 표시할지를 결정하는 다중 선택 인터페이스를 관리하는 컨테이너 뷰 컨트롤러입니다.
@MainActor class UITabBarController : UIViewController
탭바 인터페이스는 다른 모드 사이를 선택할 수 있는, 윈도우 하단에 나타나는 탭을 표시하며, 해당 모드에서 뷰를 표시하기 위한 윈도우의 하단 탭입니다. 이 클래스는 일반적으로 그 자체로 사용되지만 서브클래싱될 수도 있습니다.
탭바 컨트롤러 인터페이스의 각 탭은 커스텀 뷰 컨트롤러에 연결됩니다. 사용자가 특정 탭을 선택하면 탭바 컨트롤러는 상응하는 뷰 컨트롤러의 루트 뷰를 표시하며, 모든 이전 뷰를 대체합니다. (사용자의 탭은 이전에 선택되었던 탭과 상관없이 탭의 루트 뷰를 표시합니다. 탭이 이미 선택되었어도 마찬가지입니다.) 탭을 선택하는 것은 인터페이스의 컨텐츠를 대체하기 때문에 각 탭에 의해 관리되는 인터페이스의 타입은 어떤 방식으로든 유사할 필요가 없습니다. 사실 탭바 인터페이스는 다른 타입의 정보를 제공하거나 완전히 다른 스타일의 인터페이스를 사용하는 같은 정보 표시를 위해 사용됩니다. Figure 1은 시계 앱에 의해 나타나는 탭바 인터페이스를 보여주며, 각 탭은 정보에 기반해 시간의 타입을 나타내고 있습니다.
Figure 1 The tab bar interface in the Clock app
탭바 컨트롤러의 탭바 뷰에 직접 접근하지 않아야 합니다. 탭바 컨트롤러의 탭을 설정하려면 각 탭에 루트 뷰를 제공하는 뷰 컨트롤러를 viewControllers
속성에 할당해야 합니다. 뷰 컨트롤러를 구체화하는 정렬은 탭바에 나타나는 순서를 결정합니다. 이 속성을 설정하는 경우 어떤 뷰 컨트롤러가 초기에 선택될 것인지를 나타내기 위해 selectedViewController
속성에 값을 할당해야 합니다. (selectedIndex
속성을 사용해서 배열 인덱스로 뷰 컨트롤러를 선택할 수도 있습니다.) 앱 윈도우에 탭바 컨트롤러의 뷰(상속된 뷰 속성을 사용해 얻은)를 끼워넣는 경우 탭바 컨트롤러는 자동으로 해당 뷰 컨트롤러르 선택하며, 컨텐츠를 표시하고 필요한 경우 탭바 인터페이스의 크기에 맞춰 크기를 조절합니다.
탭바 아이템은 해당 아이템에 상응하는 뷰 컨트롤러르 통해 설정됩니다. 탭바 아이템을 뷰 컨트롤러에 연결하려면 UITabBarItem
클래스의 새 인스턴스를 생성하고, 뷰 컨트롤러에 대해 적합하게 설정해야 하며, 이를 뷰 컨트롤러의 tabBarItem
속성에 할당해야 합니다. 뷰 컨트롤러에서 커스텀 탭바 아이템을 제공하지 않는 경우 뷰 컨트롤러는 뷰 컨트롤러의 이미지 및 뷰 컨트롤러의 제목 속성으로부터의 텍스트를 포함하지 않으면서 기본값 아이템을 생성합니다.
사용자가 탭바 인터페이스에 상호작용할 때 탭바 컨트롤러 객체는 상호작용에 대한 노티피케이션을 자신의 딜리게이트에게 전달합니다. 딜리게이트는 어떠한 객체라도 될 수 있지만 UITabBarControllerDelegate
프로토콜을 따르고 있는 객체여야 합니다. 특정 탭바 아이템이 선택되는 것으로부터 방지하기 위해 딜리게이트를 사용할 수 있고, 탭이 선택되었을 때 추가적인 작업을 수행하기 위해 딜리게이트를 사용할 수도 있습니다. The More Navigation Controller에서 설명하고 있는 More navigation controller에 의해 만들어진 탭바에 대한 변경사항을 모니터링하기 위해 딜리게이트를 사용할 수도 있습니다.
More navigation controller에 대한 내용은 아래에 나옵니다.
UITabBarController
클래스가 UIViewController
클래스로부터 상속되었기 때문에 탭바 컨트롤러는 뷰 속성을 통해 접근할 수 있는 고유한 뷰를 갖고 있습니다. 탭바 컨트롤러에 대한 뷰는 탭바 뷰에 대한 컨테이너이며, 커스텀 컨텐트를 포함하고 있는 뷰에 대한 컨테이너입니다. 탭바 뷰는 사용자에게 선택 제어를 제공하며, 하나 혹은 하나 이상의 탭바 아이템으로 구성됩니다. Figure 2는 전체 탭바 인터페이스를 나타내기 위해 이와 같은 뷰들이 어떻게 조립되는지를 보여줍니다. 탭바 및 툴바 뷰에 있는 아이템이 변경될 수 있을지라도 이들을 관리하는 뷰는 변경되지 않습니다. 커스텀 컨텐트 뷰만 현재 선택된 탭에 대한 뷰 컨트롤러를 반영하기 위해 변경됩니다.
Figure 2 The primary views of a tab bar controller
탭에 대한 루트 뷰 컨트롤러로 네비게이션 컨트롤러 혹은 커스텀 뷰 컨트롤러를 사용할 수 있습니다. 루트 뷰 킨트롤러가 네비게이션 컨트롤러인 경우 탭바 컨트롤러는 표시되는 네비게이션 컨텐트의 크기를 조정함으로써 탭바를 오버랩하지 않도록 합니다. 탭바 인터페이스에서 표시하는 모든 뷰는 어떠한 조건에서라도 적합하게 뷰의 크기를 조정할 수 있도록 설정된 autoresizingMask
속성을 가져야 합니다.
탭바는 커스텀 아이템을 표시함에 있어 제약된 공간을 갖습니다. 여섯 개 혹은 더 많은 커스텀 뷰 컨트롤러를 탭바 컨트롤러에 추가하는 경우 탭바 컨트롤러는 처음 네 개의 아이템과 탭바에 대한 표준 More 아이템만을 표시합니다. More 아이템을 탭하는 것은 남아있는 아이템 선택에 대한 표준 인터페이스를 가져옵니다.
표준 More 아이템에 대한 인터페이스는 사용자가 탭바를 재설정할 수 있도록 해주는 편집 버튼을 포함합니다. 기본값으로 사용자는 탭바에 있는 모든 아이템을 재정렬할 수 있습니다. 사용자가 몇 가지 아이템에 대해 수정하지 못하도록 하길 원하는 경우 customizableViewControllers
속성에 있는 배열로부터 해당하는 뷰 컨트롤러들을 제거할 수 있습니다.
Note
탭바 커스터마이징 및 More 인터페이스는 tvOS에서 사용할 수 없습니다.
iOS 6 및 이후 버전에서 뷰 컨트롤러의 restorationIdentifier
속성에 값을 할당하는 경우 선택된 탭에서 뷰 컨트롤러에 참조를 보존합니다. 복구 시점에 같은 뷰 컨트롤러를 갖는 탭을 선택하기 위해 참조를 사용하게 됩니다.
탭바 컨트롤러를 보존하는 경우 보존하고자 하는 자식 뷰 컨트롤러에 고유한 복구 아이덴티파이어를 할당하시기 바랍니다. 자식 뷰 컨트롤러에 복구 아이덴티페이어를 생략하면 해당 탭이 기본값 설정 반환을 하도록 합니다. 탭바 컨트롤러가 viewControllers
속성에서 리스트로 나타나는 같은 정렬로 탭을 저장할지라도 저장 순서는 실제로 관련이 없습니다. 코드는 다음 launch 동안 새 탭바 컨트롤러 제공에 대한 책임을 갖게 되며, 코드는 필요한 경우 탭의 순서를 조정할 수 있게 됩니다. 상태 보존 시스템은 할당된 복구 아이덴티파이어에 기반해 각 탭의 컨텐츠를 복구하며, 탭의 위치에 기반해서 복구하는 것이 아닙니다.
상태 보존 및 복구 작업에 대한 더 많은 정보는 App Programming Guide for iOS를 보시기 바랍니다.
App Programming Guide for iOS 링크는
UIKit 링크로 연결됩니다.
App Programming Guide for iOS
https://developer.apple.com/documentation/uikit#//apple_ref/doc/uid/TP40007072
https://velog.io/@panther222128/UIKit
탭바 컨트롤러는 tvOS와 iOS에서 같은 목적성을 제공하지만 조금은 다른 UI 기능을 제공합니다.
tabBarObservedScrollView
속성을 적합한 스크롤 뷰로 설정해야 합니다. iOS에서 탭바는 항상 스크린의 하단에 고정됩니다.preferredFocusEnvironments
속성에 구체화된 가장 적합한 뷰로 이동합니다. iOS에서는 뷰 사이에서 포커스에 대한 개념이 존재하지 않습니다.viewControllers
배열로부터 뷰 컨트롤러의 수만큼을 표시할 뿐이며, iOS에서 보여지는 More 인터페이스를 제공하지 않습니다.