IT アプリ開発

【SwiftUI】さまざまなTabView

2021年12月25日

TabViewとは

SwiftUIで使用できるViewのことで、
どういうViewかというと、Lineのように下のバーにいろんなタブがあって、タップすることで上の画面が切り替わるという機能です。
一番左をタップすれば、友達リストやスタンプが表示されたり、
メッセージをタップすれば、メッセージリストが表示されたりと、TabViewを実装することで、
簡単にあのような画面を作成することができます。

TabViewではLineのトップ画面のようなものだけではなく、
さまざまなViewを作成できます。
主に、以下のようなものがあります。

  • 1. DefaultTabViewStyle(デフォルト)
  • 2. PageTabViewStyle
  • 3. CarouselTabViewStyle

1. DefaultTabViewStyle

上記で説明したLineのようなTabViewである。
デフォルトなので、tabViewStyleモディファイアを指定しない場合は、このViewスタイルで表示される。

import SwiftUI

@main
struct AppMain: App {
    
    @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate
    
    class AppDelegate: UIResponder, UIApplicationDelegate {
        
            func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
                return true
            }
        }
        
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}


struct ContentView: View {

    var body: some View{
        TabView{
            Text("チュートリアル1")
                .tabItem {
                    Image(systemName: "1.square.fill")
                    Text("First")
                }
                .tag(0)
            Text("チュートリアル2")
                .tabItem {
                    Image(systemName: "2.square.fill")
                    Text("second")
                }
                .tag(1)
            Text("チュートリアル3")
                .tabItem {
                    Image(systemName: "3.square.fill")
                    Text("third")
                }
                .tag(2)
        }
    }
}

theシンプルのTabViewですね。
Lineの下のタブのようなUIを簡単に実装できます。
上ではImageですでにswiftuiで用意されている画像を使ってますが、自分で画像を指定することも可能です。

2. PageTabViewStyle

import SwiftUI

@main
struct AppMain: App {
    
    @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate
    
    class AppDelegate: UIResponder, UIApplicationDelegate {
        
            func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
                return true
            }
        }
        
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {

    var body: some View{
        TabView{
            Text("チュートリアル1")
                .frame(width: UIScreen.main.bounds.size.width, height: 500)
                .background(Color(red: 0.8, green: 0.8, blue: 0.8))
                .tag(0)
            Text("チュートリアル2")
                .frame(width: UIScreen.main.bounds.size.width, height: 500)
                .background(Color(red: 0.6, green: 0.99, blue: 0.6))
                .tag(1)
            Text("チュートリアル3")
                .frame(width: UIScreen.main.bounds.size.width, height: 500)
                .background(Color(red: 1, green: 0.75, blue: 0.78))
                .tag(2)
        }
        .tabViewStyle(PageTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
    
    }
}

TabViewに対して、
TabViewのモディファイである.tabViewStyle(PageTabViewStyle())
を指定することで、以下のような画面を作成できる。

よくチュートリアルで説明を簡単に横スクロールで説明していくスタイルであったり、
利用規約で使われたりする。

.tabViewStyle(CarouselTabViewStyle())
.indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))を指定することで、
画面スワイプした時に、今何番目の画面なのかを表示してくれる機能がある。

3. CarouselTabViewStyle

struct SampleTabBarView:View{
    
    var body: some View{
        TabView{
            Text("チュートリアル1")
                .frame(width: 300, height: 500)
                .background(Color(red: 0.8, green: 0.8, blue: 0.8)) 
                .tag(0)
            Text("チュートリアル2")
                .frame(width: 300, height: 500)
                .background(Color(red: 0.6, green: 0.99, blue: 0.6)) 
                .tag(1)
            Text("チュートリアル3")
                .frame(width: 300, height: 500)
                .background(Color(red: 1, green: 0.75, blue: 0.78)) 
                .tag(2)
        }
        .tabViewStyle(CarouselTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
    }
}

-IT, アプリ開発
-

© 2024 Yosshi Labo. Powered by AFFINGER5