SwiftUI TabView 分頁教學
TabView 是 App 中最常見的頂層導航方式,通常位於螢幕底部,讓使用者在不同的主要功能區塊間切換。
基礎 TabView
建立 TabView 很簡單,只需要把每個頁面放進去,並加上 .tabItem 修飾符。
struct ContentView: View {
var body: some View {
TabView {
// 第一頁
Text("首頁內容")
.tabItem {
Label("首頁", systemImage: "house")
}
// 第二頁
Text("設定內容")
.tabItem {
Image(systemName: "gear")
Text("設定")
}
}
}
}
控制當前分頁 (使用 Enum 最佳實踐)
雖然可以用 Int 來控制分頁,但使用 Enum 會讓程式碼更具可讀性且更容易維護。
// 定義所有 Tab 選項
enum Tab {
case home, settings
}
struct ContentView: View {
@State private var selectedTab: Tab = .home // 儲存當前狀態
var body: some View {
TabView(selection: $selectedTab) {
HomeView()
.tabItem { Label("首頁", systemImage: "house") }
.tag(Tab.home) // 綁定 Enum
SettingsView()
.tabItem { Label("設定", systemImage: "gear") }
.tag(Tab.settings)
}
}
}
struct HomeView: View {
var body: some View {
VStack {
Text("這是首頁")
Button("去設定頁") {
// 如果這裡需要控制切換,通常會把 selectedTab 傳進來或是用 EnvironmentObject
}
}
}
}
struct SettingsView: View {
var body: some View {
Text("這是設定頁")
}
}
紅點通知 (Badge)
從 iOS 15 開始,我們可以直接使用 .badge() 來顯示未讀通知數量。這在通訊軟體或購物車中非常常見。
TabView {
Text("訊息")
.tabItem { Label("Chat", systemImage: "message") }
.badge(5) // 顯示數字 5
Text("購物車")
.tabItem { Label("Cart", systemImage: "cart") }
.badge("New") // 也可以顯示文字
}
PageTabViewStyle (圖片輪播)
TabView 不僅可以用作底部導航,還可以變成類似 Instagram 多張圖片的水平滑動輪播效果。只要加上 .tabViewStyle(.page) 即可。
TabView {
Color.red
Color.green
Color.blue
}
.tabViewStyle(.page)
.indexViewStyle(.page(backgroundDisplayMode: .always)) // 顯示下面的小白點背景
這在製作 App 的「功能介紹 (Onboarding)」或「圖片瀏覽器」時非常實用。
樣式客製化
SwiftUI 原生的 TabView 可客製化程度有限 (主要是改顏色)。如果需要更改 TabBar 的背景色,通常需要使用 UITabBar.appearance() (這是一個 UIKit 的 workaround)。
init() {
// 修改未選中項目的顏色
UITabBar.appearance().unselectedItemTintColor = UIColor.gray
// 修改背景色
UITabBar.appearance().backgroundColor = UIColor.systemBackground
}
或是使用 .tint(.red) 來改變選中項目的顏色。
總結
- 使用
TabView建立底部導航。 - 推薦使用
Enum配合.tag()來管理分頁。 - 使用
.badge()顯示紅點。 .tabViewStyle(.page)可變身為輪播圖。