탭을 할 수 있는 UI 를 만들기 위해서는 TabView에 뷰를 배치하고 각 탭의 내용에 tabItem(_:) modifier 를 적용합니다. iOS 에서는 badge modifier 같은 badge(_:) 를 사용하여 각 탭에 badge 를 할당할수도 있습니다.

 

다음 예제는 세 개의 탭이 있는 탭 보기를 생성하며, 각각은 사용자 지정 자식 보기를 제공합니다. 첫 번째 탭에는 숫자 배지가 있고 세 번째 탭에는 문자열 badge가 있습니다.

TabView {
    ReceivedView()
        .badge(2)
        .tabItem {
            Label("Received", systemImage: "tray.and.arrow.down.fill")
        }
    SentView()
        .tabItem {
            Label("Sent", systemImage: "tray.and.arrow.up.fill")
        }
    AccountView()
        .badge("!")
        .tabItem {
            Label("Account", systemImage: "person.crop.circle.fill")
        }
}

 

 

자신이 선택한 탭을 구분하기 위해서는 selection을 사용하여 구분할 수 있습니다. 다음 예제 코드는 selection 과 tag 를 통해서 어느쪽을 탭하였는지를 알 수 있습니다. BooksView() 를 탭하게 된다면 selectedView는 tag에 의해 0으로 바뀔 것이고 SettingsView() 를 선택하게 된다면 tag에 의해 selectedView 는 1로 바뀌게 됩니다.

struct ContentView: View {
   @State private var selectedView: Int = 1

   var body: some View {
      TabView(selection: $selectedView) {
         BooksView()
            .tabItem({
               Label("Books", systemImage: "book.circle")
            }).tag(0)
         SettingsView()
            .tabItem({
               Label("Settings", systemImage: "gear")
            }).tag(1)
      }
   }
}

 

TabView 는 한가지 스타일만 존재하는 것이 아닙니다. page 라는 스타일을 통해서 스와이핑과 탭을 통해서 페이지를 옮길수도 있습니다. 그러기 위해서는 tabViewStyle.page 로 설정해야하며 indexViewStyle 을 통해서 아래 현재 TabView 의 위치를 보여줄 수 있습니다.

struct ContentView: View {
   @State private var selectedView: Int = 1

   var body: some View {
       TabView(selection: $selectedView) {
           BooksView()
               .tabItem({
                   Label("Books", systemImage: "book.circle")
               }).tag(0)
           SettingsView()
               .tabItem({
                   Label("Settings", systemImage: "gear")
               }).tag(1)
       }.tabViewStyle(.page)
           .indexViewStyle(.page(backgroundDisplayMode: .always))
   }
}

 

'SwiftUI' 카테고리의 다른 글

GeometryReader  (0) 2023.12.19
horizontalSizeClass (make size different layout)  (0) 2023.12.19
Confirmation Dialog - 하단 메뉴  (0) 2023.12.19
Alert View  (0) 2023.12.19
Modal View (sheet)  (0) 2023.12.19
ytw_developer