SwiftUI TabView:打造出色分頁的關鍵指南

更新於 2024/10/30閱讀時間約 9 分鐘

SwiftUI的TabView實在太好用啦!我要大大的推廣他ლ(╹◡╹ლ)

換頁+小圓點滑動

手動換頁

手動換頁

TabView {
Text("First")
Text("Second")
Text("Third")
Text("Fourth")
}.background(Color.red)
.tabViewStyle(.page) // 重點:TabView的樣式設成.page
.indexViewStyle(.page)

補充:

在官網上看到tabViewStyle有.verticalPage可以使用,我還以為可以像直播App那樣上滑下滑翻頁,結果寫不出來,去查才發現是WatchOS才有

更改小圓點樣式

寫法.indexViewStyle(.page(backgroundDisplayMode: .interactive))
有四種可以選always, automatic, interactive, never。但除了always,其他都長的一樣🧐

.always

.always

.automatic, .interactive, .never

.automatic, .interactive, .never

另一種寫法是寫在tabViewStyle裡.tabViewStyle(.page(indexDisplayMode: .never))有三種可以選always, automatic, never

  • never不顯示小圓點
  • always, automatic 長得跟上面第二種一樣。

無限自動輪播

自動輪播

自動輪播

自動輪播重點就是增加一個Timer,滑到最後一個的時候,跳回第一個。這邊我有去調TabView的尺寸,做成一般廣告自動輪播的感覺。

struct PageDemoView2: View {
private let timer = Timer.publish(every: 1.5, on: .main, in: .common).autoconnect()
@State var selection = "First"
@State var startIndex = 0
var order = ["First", "Second", "Third", "Fourth"]
var body: some View {
TabView(selection: $selection) {
ForEach(order, id: \.self) { item in
Text(item)
}
}.frame(height: 200.0) // 調整UI
.background(Color.red)
.tabViewStyle(.page)
.indexViewStyle(.page)
.cornerRadius(5.0) // 調整UI
.padding([.leading, .trailing], 10) // 調整UI
.onReceive(timer) { _ in
self.startIndex += 1
if self.startIndex > 3 {
self.startIndex = 0 // index滑到最後時,把它改回第一個
}
self.selection = self.order[self.startIndex]
print("\(self.selection)")
}

}
}


進階版:無限自動+手動輪播

1106更新:

上面寫的自動輪播,缺失了手動的部分。因為只用timer控制播到最後一個的時候跳回第一個,使用者手動去滑的話就會沒效。

無限手動輪播的重點就是要增加假的元件,使用者往後滑動,滑到假元件最後一個,跳回真的第一個。往前滑動,滑到假元件第一個,跳回真的最後一個。

struct PageDemoView2: View {
private let timer = Timer.publish(every: 1.5, on: .main, in: .common).autoconnect()
@State var startIndex = 0
var order = ["First", "Second", "Third", "Fourth"]
var body: some View {
TabView(selection: $startIndex) {
Spacer().tag(-1) // 增加假的第一個
ForEach(order.indices, id: \.self) { index in
Text(order[index]).tag(index)
}
Spacer().tag(order.count) // 增加假的最後一個
}.frame(height: 200.0)
.background(Color.red)
.tabViewStyle(.page(indexDisplayMode: .never)) // 把小圓點藏起來
.cornerRadius(5.0)
.padding([.leading, .trailing], 10)
.onReceive(timer) { _ in // timer自動跳
self.startIndex += 1
if self.startIndex > 3 {
self.startIndex = 0
}
}.onChange(of: startIndex) { newValue in // 手動滑動時
if startIndex == order.count { // 往後滑動,滑到假的最後一個
startIndex = 0 // 跳回真的第一個
} else if startIndex == -1 {
startIndex = order.count - 1 // 往前滑動,滑到假的第一個
} // 跳到真的最後一個
}
}
}


用圖來說明的話,紅色是真的要顯示的元件,綠色是我為了達成無限輪播做的假元件(Spacer().tag(-1)和Spacer().tag(order.count))

使用者滑到第三頁

使用者滑到第三頁

使用者滑到第四頁

使用者滑到第四頁

使用者滑到最後的假元件,跳到真的第一個

使用者滑到最後的假元件,跳到真的第一個

反之同理。不過這個作法需要注意的地方是因為實際上的元件數量跟顯示的對不起來。以上面為例,使用者只看到四頁,但小圓點會顯示六個,所以這邊沒辦法用TabView預設的小圓點,需要自己額外刻UI。

參考資料:

https://stackoverflow.com/questions/76824297/swiftui-infinite-carousel-with-tabview-and-asyncimage-how-to-achieve-carousel

底部TabBar分頁

底部TabBar也可以用SwiftUI來實現,直接貼官網的範例

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")
}
}
TabBar

TabBar

比起UIKit code精簡好多,實在太讚了ლ(╹◡╹ლ)ლ(╹◡╹ლ)ლ(╹◡╹ლ)

avatar-img
7會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
這個浮誇標題是ChatGPT幫我想的😊 圖也是DALL幫我產的, AI萬歲! GCD也是面試必問題啊!我答超爛的,只會用背景呼叫API+切Main Thread更新畫面,今天就來認真了解。 GCD是什麼? 先來問ChatGPT什麼是GCD? GCD,全名 Grand Central Dis
字數算法 = string.count? 在swift算一個string的字數時候,很直覺的會想到用.count來算 let s = "這是幾個字呢".count print(s.count) // 6 毫無疑問的安心信賴6個字 表情符號的場合 let emoji = "😂" print
Xcode15的 @escaping closure裡解包後的[weak self]不必再寫 self了!! 用一個範例class Test來實驗,裡面只有一個變數a跟一個testClosure回"test",再用callTestClosure把變數a改成"test" 編譯正常!變數a成功被改成
一樣先來看官方文件 A view controller that provides access to documents or destinations outside your app’s sandbox. 其實就是讓你去讀取檔案App的東西 有兩種模式,Don’t copy the do
iCloud+的服務 只有付錢的人才能用,免費仔如我從來沒聽過😗 簡介 通常你在瀏覽網頁時,網路供應商和你所造訪的網站可以看到網頁流量所包含的資訊(例如 DNS 記錄和 IP 位址)。此資訊可用來判斷你的身分,並建立描述檔來記錄你的位置以及往後的瀏覽記錄。 「iCloud 私密轉送」的設計旨
漸層文字 做出像Apple Keynote主題一樣的美美漸層文字 先畫出一大塊美美漸層色,可以選自己喜歡的顏色跟角度去做喔 LinearGradient(colors: [.blue, .purple, .red], startPoint: .bottomLead
這個浮誇標題是ChatGPT幫我想的😊 圖也是DALL幫我產的, AI萬歲! GCD也是面試必問題啊!我答超爛的,只會用背景呼叫API+切Main Thread更新畫面,今天就來認真了解。 GCD是什麼? 先來問ChatGPT什麼是GCD? GCD,全名 Grand Central Dis
字數算法 = string.count? 在swift算一個string的字數時候,很直覺的會想到用.count來算 let s = "這是幾個字呢".count print(s.count) // 6 毫無疑問的安心信賴6個字 表情符號的場合 let emoji = "😂" print
Xcode15的 @escaping closure裡解包後的[weak self]不必再寫 self了!! 用一個範例class Test來實驗,裡面只有一個變數a跟一個testClosure回"test",再用callTestClosure把變數a改成"test" 編譯正常!變數a成功被改成
一樣先來看官方文件 A view controller that provides access to documents or destinations outside your app’s sandbox. 其實就是讓你去讀取檔案App的東西 有兩種模式,Don’t copy the do
iCloud+的服務 只有付錢的人才能用,免費仔如我從來沒聽過😗 簡介 通常你在瀏覽網頁時,網路供應商和你所造訪的網站可以看到網頁流量所包含的資訊(例如 DNS 記錄和 IP 位址)。此資訊可用來判斷你的身分,並建立描述檔來記錄你的位置以及往後的瀏覽記錄。 「iCloud 私密轉送」的設計旨
漸層文字 做出像Apple Keynote主題一樣的美美漸層文字 先畫出一大塊美美漸層色,可以選自己喜歡的顏色跟角度去做喔 LinearGradient(colors: [.blue, .purple, .red], startPoint: .bottomLead
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
探索如何使用SwiftUI的Grid來實現Bento Grid UI,這是一種靈感來自日本便當盒的設計方法。學習如何通過圓角矩形卡片進行動態排版,並利用Grid和GridRow創建適合大尺寸螢幕的靈活佈局。提升使用者體驗和視覺美感的實用指南。
Thumbnail
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
Thumbnail
SwiftUI的TabView實在太好用啦!我要大大的推廣他ლ(╹◡╹ლ) 換頁+小圓點滑動 無限自動輪播 底部Tabbar
Thumbnail
前陣子花了一些時間在招募補習班師資管理人員,面試的過程中和許多的求職者聊到如何做好補習班的師資管理,覺得還蠻有收穫的,因此我把這些內容整理出來,跟大家分享~
Thumbnail
了解自己是一輩子的課題。打造個人品牌除了是現在職場的生存法則,也是剛需,但同時也是很能夠幫助自我了解的一個過程。因為最重要的第一步,就是要確認個人品牌定位與標籤!
Thumbnail
在現今數位時代,擁有一個吸引人的網頁設計已成為企業和個人品牌成功的關鍵因素之一。一個出色的網頁設計不僅能提升用戶體驗,更能增加網站的黏著度和轉換率。本文將為您解析如何打造一個出色的網頁設計,以及介紹一些實用的工具,讓您的網頁在競爭激烈的市場中脫穎而出。
Thumbnail
只要做出好的提案,就一定會被對方接受買單嗎?那可不一定。在成為幕僚角色的初期,我總認為只要用心做出好提案,就應該會被對方所接受。多年之後,我才明白不是好的提案就會被買單,而是被買單的才是好的提案。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
探索如何使用SwiftUI的Grid來實現Bento Grid UI,這是一種靈感來自日本便當盒的設計方法。學習如何通過圓角矩形卡片進行動態排版,並利用Grid和GridRow創建適合大尺寸螢幕的靈活佈局。提升使用者體驗和視覺美感的實用指南。
Thumbnail
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
Thumbnail
SwiftUI的TabView實在太好用啦!我要大大的推廣他ლ(╹◡╹ლ) 換頁+小圓點滑動 無限自動輪播 底部Tabbar
Thumbnail
前陣子花了一些時間在招募補習班師資管理人員,面試的過程中和許多的求職者聊到如何做好補習班的師資管理,覺得還蠻有收穫的,因此我把這些內容整理出來,跟大家分享~
Thumbnail
了解自己是一輩子的課題。打造個人品牌除了是現在職場的生存法則,也是剛需,但同時也是很能夠幫助自我了解的一個過程。因為最重要的第一步,就是要確認個人品牌定位與標籤!
Thumbnail
在現今數位時代,擁有一個吸引人的網頁設計已成為企業和個人品牌成功的關鍵因素之一。一個出色的網頁設計不僅能提升用戶體驗,更能增加網站的黏著度和轉換率。本文將為您解析如何打造一個出色的網頁設計,以及介紹一些實用的工具,讓您的網頁在競爭激烈的市場中脫穎而出。
Thumbnail
只要做出好的提案,就一定會被對方接受買單嗎?那可不一定。在成為幕僚角色的初期,我總認為只要用心做出好提案,就應該會被對方所接受。多年之後,我才明白不是好的提案就會被買單,而是被買單的才是好的提案。