この記事では、SwiftUIでTabViewを実装する方法について徹底解説していきたいと思います。
TabViewの基本的な実装方法

以下のように記述します。
struct ContentView: View {
var body: some View {
TabView {
TabAView()
.tabItem {
Image(systemName: "square.and.arrow.up")
Text("TabA")
}
TabBView()
.tabItem {
Image(systemName: "pencil.circle")
Text("TabB")
}
}
}
}
struct TabAView: View {
var body: some View {
Text("TabA")
}
}
struct TabBView: View {
var body: some View {
Text("TabB")
}
}
このようにTabView()の中に、Viewを入れる形で書きます。タブは最大5つ表示させることができます。
タブが6以上になると、以下のように一番右のタブが『More』というリストのタブになり、5つ目以降のタブが格納されます。右上にEditというボタンも追加され、ここをいじるとタブの位置を変更することができます。(この機能使ってるアプリ見たことない。。)

基本的にタブは6つ以上にするべきではないですね。
TabViewの色を変更する
アクセントカラーを変更する方法

タブバーの選択している色を変更することができます。
struct ContentView: View {
var body: some View {
TabView {
省略...
}.accentColor(.red)
}
}
.accentColor(.red)で変更できます。
タブの背景色を変更する

タブバーの色をつけるとレイアウト的に少しダサくなる気もしますが、、、以下のように記述すると色を変更できます。
struct ContentView: View {
init() {
UITabBar.appearance().backgroundColor = .gray
}
var body: some View {
TabView() {
TabAView()
.tabItem {
Image(systemName: "square.and.arrow.up")
Text("TabA")
}
TabBView()
.tabItem {
Image(systemName: "pencil.circle")
Text("TabB")
}
}
}
}
非選択のタブの色を変更する

上記と同じように、init()を以下のように記述してください。
init() {
UITabBar.appearance().unselectedItemTintColor = .purple
}
Tagをつけて初期表示タブを変更する

初期表示のタブを変えたいという時があると思います。そのような時は以下のように記述します。
struct ContentView: View {
@State var selectTabIndex = 1
var body: some View {
TabView(selection: $selectTabIndex) {
TabAView()
.tabItem {
Image(systemName: "square.and.arrow.up")
Text("TabA")
}.tag(0)
TabBView()
.tabItem {
Image(systemName: "pencil.circle")
Text("TabB")
}.tag(1)
}
}
}
.tag()をつけることで、タブの選択状態を操ることができます。
おまけ
以下のように5個以上のタブがあると長くなってしまいます。
struct ContentView: View {
var body: some View {
TabView {
Tab1View()
.tabItem {
VStack {
Image(systemName: "1.circle")
Text("タブ1")
}
}
.tag(1)
Tab2View()
.tabItem {
VStack {
Image(systemName: "2.circle")
Text("タブ2")
}
}
.tag(2)
Tab3View()
.tabItem {
VStack {
Image(systemName: "3.circle")
Text("タブ3")
}
}
.tag(3)
Tab4View()
.tabItem {
VStack {
Image(systemName: "4.circle")
Text("タブ4")
}
}
.tag(4)
Tab5View()
.tabItem {
VStack {
Image(systemName: "5.circle")
Text("タブ5")
}
}
.tag(5)
}
}
}
ですので、以下のようにまとめることができます。
struct ContentView: View {
var body: some View {
TabView {
tabItemView(destination: Tab1View(), imageName: "1.circle", title: "タブ1", tag: 1)
tabItemView(destination: Tab2View(), imageName: "2.circle", title: "タブ2", tag: 2)
tabItemView(destination: Tab3View(), imageName: "3.circle", title: "タブ3", tag: 3)
tabItemView(destination: Tab4View(), imageName: "4.circle", title: "タブ4", tag: 4)
tabItemView(destination: Tab5View(), imageName: "5.circle", title: "タブ5", tag: 5)
}
}
@ViewBuilder
private func tabItemView<Destination: View>(destination: Destination, imageName: String, title: String, tag: Int) -> some View {
destination
.tabItem {
VStack {
Image(systemName: imageName)
Text(title)
}
}
.tag(tag)
}
}

