https://developer.apple.com/documentation/uikit/uisplitviewcontroller
"A container view controller that implements a hierarchical interface."
계층구조 인터페이스를 구현하는 컨테이너 뷰 컨트롤러입니다.
@MainActor class UISplitViewController : UIViewController
스플릿 뷰 컨트롤러는 계층구조 인터페이스에서 자식 뷰 컨트롤러를 관리하는 컨테이너 뷰 컨트롤러입니다. 이 타입의 인터페이스에서 하나의 뷰 컨트롤러 드라이브에 있는 변경사항은 다른 하나의 컨텐트를 변경합니다.
스플릿 뷰 인터페이스는 필터링이 있는 컨텐트 혹은 컨텐트 계층구조 탐색에 가장 적합하며, 메모 앱 내에서 각 메모를 보기 위해 폴더와 메모를 탐색하는 것이 대표적입니다. 메모 앱에서 primary sidebar의 폴더를 선택하는 것은 해당 폴더에 있는 메모의 리스트를 보여주며, 리스트로부터 메모를 선택하는 것은 두 번째 뷰에서 해당 메모의 컨텐츠를 보여줍니다.
앱의 UI를 빌드할 때 스플릿 뷰 컨트롤러는 보통 앱 윈도우의 루트 뷰 컨트롤러입니다. 스플릿 뷰 컨트롤러는 스스로 중요한 모양을 갖지 않습니다. 대부분의 모양은 설치한 자식 뷰 컨트롤러들에 의해 정의됩니다.
Note
스플릿 뷰 컨트롤러를 네비게이션 스택에 푸시할 수 없습니다. 몇 가지 다른 컨테이너 뷰 컨트롤러에 자식으로써 스플릿 뷰 컨트롤러를 설치하는 것이 가능할지라도, 그렇게 하는 것은 대부분의 경우에 권장되지 않습니다. 디자인 가이드는 iOS Human Interface Guidelines를 보시기 바랍니다.
iOS Human Interface Guidelines
https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/
https://velog.io/@panther222128/iOS
iOS 14 및 이후 버전에서 UISplitViewController
는 열 스타일 레이아웃을 지원합니다. 열 스타일 스플릿 뷰 컨트롤러는 적합한 스타일로 init(style:)
을 사용해서 둘 혹은 세 열을 갖는 인터페이스를 생성할 수 있도록 해줍니다.
UISplitViewController.Style.doubleColumn
스타일을 사용하시기 바랍니다. 스플릿 뷰 컨트롤러의 이 스타일은 두 개의 자식 뷰 컨트롤러를 관리하며, primary 열과 secondary 열에 위치합니다.UISplitViewController.Style.tripleColumn
스타일을 사용하시기 바랍니다. 스플릿 뷰 컨트롤러의 이 스타일은 세 개의 자식 뷰 컨트롤러를 관리하며, primary 열, supplementary 열, secondary 열에 위치합니다.iOS 14 이전 버전에서 UISplitViewController
는 primary 뷰 컨트롤러와 secondary 뷰 컨트롤러를 갖는 하나의 스플릿 뷰 인터페이스 스타일을 지원했습니다. 이 클래식 인터페이스 스타일은 init(style:)
이 아닌 다른 접근방법을 사용해서 생성된 스플릿 뷰 컨트롤러를 적용합니다. 클래식 인터페이스를 갖는 스플릿 뷰 컨트롤러는 UISplitViewController.Style.unspecified
의 스타일이며, iOS 14 및 이후 버전에서 소개된 열 스타일 API 모두에 응답하지 않습니다.
열 스타일 스플릿 뷰 인터페이스에서 각 열에 뷰 컨트롤러를 설정하고 가져오기 위해 setViewController(_:for:)
와 viewController(for:)
메소들르 사용하시기 바랍니다. 스플릿 뷰 컨트롤러는 네비게이션 컨트롤러에 있는 모든 자식 뷰 컨트롤러들을 감싸게 됩니다. 네비게이션 컨트롤러가 아닌 자식 뷰 컨트롤러를 설정하면, 스플릿 뷰 컨트롤러는 네비게이션 컨트롤러를 생성합니다. 스플릿 뷰 컨트롤러는 viewController(for:)
를 통해서 기존 뷰 컨트롤러를 반환하지만, children
속성은 뷰 컨트롤러를 감싸기 위하 사용되는 네비게이션 컨트롤러를 포함합니다. 특정 열에 뷰 컨트롤러를 할당한 후 해당 칼럼들을 show(_:)
혹은 hide(_:)
를 사용해서 보여주거나 숨길 수 있습니다.
클래식 스플릿 뷰 인터페이스에서 뷰 컨트롤러를 viewControllers
속성에 할당함으로써 인터페이스 빌더를 사용하거나 코드 작성을 통해 자식 뷰 컨트롤러를 설정할 수 있습니다. primary 혹은 두 번째 뷰 컨트롤러를 변경할 필요가 있는 경우에서 show(_:sender:)
, showDetailViewController(_:sender:)
메소드를 사용해 변경하는 것을 권장합니다. 이와 같은 메소드를 사용(직접 viewControllers
속성을 수정하는 것 대신)하는 것은 스플릿 뷰 컨트롤러가 특정 뷰 컨트롤러를 현재 디스플레이 모드 및 크기 클래스에 가장 적합한 방식으로 나타낼 수 있도록 해줍니다.
스플릿 뷰 컨트롤러는 인터페이스에서 특정 변경에 대한 응답으로 축소 및 확장 전환을 수행합니다. 예를 들어 전환은 수평 regular와 수평 compact 사이에서 인터페이스의 크기 클래스가 토글할 때, 사용자 상호작용이 열을 숨기거나 나타낼 때, 코드 작성으로 열을 숨기거나 보여줄 때 발생합니다. 스플릿 뷰 컨트롤러는 축소 및 확장 전환을 수행하기 위해 자신의 딜리게이트 객체와 함께 작동합니다. 딜리게이트는 UISplitViewControllerDelegate
프로토콜을 채택하는 객체입니다.
열 스타일 스플릿 뷰 인터페이스에서 인터페이스가 축소될 때, parimary, supplementary, secondary가 아닌 다른 뷰 컨트롤러를 보여줄 수 있습니다. setViewController(_:for:)
를 사용해서 원하는 뷰 컨트롤러를 UISplitViewController.Column.compact
열에 설정하시기 바랍니다. 더 나아가서 축소 및 확장 전환을 커스터마이징하길 원한다면 Column-Style Split Views를 보시기 바랍니다.
Column-Style Split Views
https://developer.apple.com/documentation/uikit/uisplitviewcontrollerdelegate#3596702
https://velog.io/@panther222128/UISplitViewControllerDelegate
클래식 스플릿 뷰 인터페이스에서 전환을 관리하는 것에 대한 정보는 Classic Split Views를 보시기 바랍니다.
Classic Split Views
https://developer.apple.com/documentation/uikit/uisplitviewcontrollerdelegate#3596702
https://velog.io/@panther222128/UISplitViewControllerDelegate
스플릿 뷰 컨트롤러의 현재 디스플레이 모드는 자식 뷰 컨트롤러들의 시각적 정렬을 나타냅니다. 몇 가지 자식 뷰 컨트롤러를 보여줄지 결정하며, 각각의 관계에서 어떻게 위치될지를 결정합니다. 예를 들어 자식 뷰 컨트롤러가 서로 옆으로 나타나도록 정렬할 수 있으며, 한 번에 한 가지만 보여지도록 정렬할 수도 있고, 다른 자식 뷰 컨트롤러에 의해 부분적으로 한 가지가 가려지도록 정렬할 수도 있습니다.
디스플레이 모드를 직접 설정하는 것 대신 preferredDisplayMode
속성을 사용해서 선호하는 디스플레이 모드를 설정해야 합니다. 스플릿 뷰 컨트롤러는 구체화한 디스플레이 모드를 나타내려고 하지만, 공간의 제약 때문에 해당 모드를 시각적으로 수용하지 못할 수도 있습니다. 예를 들어 수평 compact 환경에서 자식 뷰 컨트롤러들을 옆으로 표시할 수 없습니다. 가능한 설정에 대한 내용은 UISplitViewController.DisplayMode
를 보시기 바랍니다.
UISplitViewController.DisplayMode
https://developer.apple.com/documentation/uikit/uisplitviewcontroller/displaymode
https://velog.io/@panther222128/UISplitViewController.DisplayMode
선호하는 디스플레이 모드를 설정한 후 스플릿 뷰 컨트롤러는 스스로를 업데이트하고 displayMode
속성에서 실제 디스플레이 모드를 반영합니다. 어떤 열이 보여질지를 변경하길 원하는 경우 show(_:)
혹은 hide(_:)
사용을 시도해보시기 바랍니다. 스플릿 뷰 컨트롤러는 원하는 열을 표시하기 위한 디스플레이 모드 업데이트 방법을 결정할 것입니다.
사용자 상호작용에 대해 현재 디스플레이 모드를 변경하기 위한 몇 가지 방법이 존재합니다.
스플릿 뷰 컨트롤러는 사용자가 스와이프를 사용해서 디스플레이 모드를 변경할 수 있도록 해주는 내장된 제스쳐 리코그나이저를 설치합니다. presentsWithGesture
속성을 false
로 설정해서 이와 같은 제스쳐 리코그나이저를 억제할 수 있습니다. 예를 들어 primary 뷰 컨트롤러가 항상 보여지길 원한다면 이 속성을 false
로 설정하게 될 것입니다.
presentsWithGesture
가 true
인 경우 스플릿 뷰 컨트롤러는 디스플레이 모드 변경을 위한 특수한 바 버튼 아이템도 제공합니다. 스플릿 뷰 컨트롤러는 이 아이템의 동작, 모양, 위치를 관리합니다. 이는 UISplitViewController.SplitBehavior.tile
에서 사이드바 토글 아이콘으로 나타나며, UISplitViewController.SplitBehavior.overlay
및 UISplitViewController.SplitBehavior.displace
에서 back-chevron 아이콘으로 나타납니다. 이 버튼을 탭하는 것은 현재 디스플레이 모드 및 스플릿 동작에 기반해 새 디스플레이 모드로 전환합니다.
디스플레이 모드에 영향을 주는 세 개의 열 스플릿 뷰 인터페이스(UISplitViewController.Style.tripleColumn
의 스타일을 갖는)의 다른 속성은 showsSecondaryOnlyButton
입니다. 이 속성이 true
이면 스플릿 뷰 컨트롤러는 UISplitViewController.DisplayMode.secondaryOnly
로 디스플레이 모드를 토글하는 것과 이 모드로부터 디스플레이 모드를 토글하는 것에 대한 다른 바 버튼 아이템을 제공합니다. 스플릿 뷰 컨트롤러는 이 아이템의 동작, 모양, 위치를 관리합니다. 이는 double-arrow 아이콘으로 나타납니다. 사용자가 이 버튼을 탭하면 UISplitViewController.DisplayMode.secondaryOnly
로 혹은 이 모드로부터 디스플레이 모드를 토글합니다.
스플릿 뷰 컨트롤러의 스플릿 동작은 secondary 뷰 컨트롤러가 다른 뷰 컨트롤러에 대한 관계에서 어떻게 나타날지를 제어합니다. secondary 뷰 컨트롤러가 항상 다른 뷰 컨트롤러에 대해 옆으로 나타나도록 설정할 수 있으며, 다른 뷰 컨트롤러에 의해 부분적으로 가려지도록 나타나게 할 수도 있고, 다른 뷰 컨트롤러에 공간을 만들어주기 위해 반대쪽 방향으로 스크린 밖에 빠져나가도록 할 수도 있습니다.
스플릿 동작을 직접 설정하는 것이 아니라 preferredSplitBehavior
속성을 사용해서 선호하는 스플릿 동작을 설정할 수 있습니다. 이 변경사항은 다음 레이아웃 발생 후에 효과가 나타납니다. 스플릿 뷰 컨트롤러는 splitBehavior
속성에서 실제 스플릿 동작을 반영합니다. splitBehavior
속성의 값은 스플릿 뷰 컨트롤러에서 어떤 디스플레이 모드가 사용 가능한지에 영향을 미칩니다. 가능한 설정에 대한 내용은 UISplitViewController.SplitBehavior
를 보시기 바랍니다.
UISplitViewController.SplitBehavior
https://developer.apple.com/documentation/uikit/uisplitviewcontroller/splitbehavior
https://velog.io/@panther222128/UISplitViewController.SplitBehavior
선호하는 디스플레이 모드를 설정한 후 스플릿 뷰 컨트롤러는 스스로를 업데이트하며, displayMode
속성에서 실제 디스플레이 모드를 반영합니다. 어떤 열이 보여질지를 변경하길 원하는 경우 show(_:)
혹은 hide(_:)
사용을 시도해보시기 바랍니다. 스플릿 뷰 컨트롤러는 디스플레이 모드를 어떻게 원하는 열로 표시할지를 결정할 것입니다.
스플릿 뷰 인터페이스의 primary 및 supplementary 열의 커스텀 넓이를 구체화할 수 있으며, preferredPrimaryColumnWidthFraction
과 preferredSupplementaryColumnWidthFraction
을 조정해서 구체화할 수 있습니다. 이 속성들에 값을 구체화하지 않는 경우 기본값으로 automaticDimension
이 되며, 시스템은 사용 가능한 공간에 기반해 적합한 동작을 결정합니다.
스플릿 뷰 컨트롤러는 앱의 윈도우와 자식 뷰 컨트롤러 사이에서 스스로 끼어듭니다. 결과적으로 자식 뷰 컨트롤러에 대한 모든 메시지는 스플릿 뷰 컨트롤러를 통해 흐름을 가져야 합니다. 메시지는 적합한 시점에 전달됩니다. 예를 들어 뷰의 나타남과 사라짐 메시지는 상응하는 자식 뷰 컨트롤러가 실제로 스크린에 나타날 때에만 전달됩니다.
스플릿 뷰 컨트롤러의 restorationIdentifier
속성에 값을 할당하는 경우 유효한 복구 아이덴티파이어를 갖는 모든 자식 뷰 컨트롤러를 보존합니다. 다음 launch 주기 동안 스플릿 뷰 컨트롤러는 보존된 뷰 컨트롤러를 이전 상태로 복구합니다. 스플릿 뷰 컨트롤러는 각 자식의 복구 경로가 고유하는 것을 보장할 수 있도록 자동으로 추가적인 정보를 저장합니다.