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

閱讀時間約 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精簡好多,實在太讚了ლ(╹◡╹ლ)ლ(╹◡╹ლ)ლ(╹◡╹ლ)

6會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
發表第一個留言支持創作者!
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
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
前陣子花了一些時間在招募補習班師資管理人員,面試的過程中和許多的求職者聊到如何做好補習班的師資管理,覺得還蠻有收穫的,因此我把這些內容整理出來,跟大家分享~
Thumbnail
了解自己是一輩子的課題。打造個人品牌除了是現在職場的生存法則,也是剛需,但同時也是很能夠幫助自我了解的一個過程。因為最重要的第一步,就是要確認個人品牌定位與標籤!
Thumbnail
在現今數位時代,擁有一個吸引人的網頁設計已成為企業和個人品牌成功的關鍵因素之一。一個出色的網頁設計不僅能提升用戶體驗,更能增加網站的黏著度和轉換率。本文將為您解析如何打造一個出色的網頁設計,以及介紹一些實用的工具,讓您的網頁在競爭激烈的市場中脫穎而出。
Thumbnail
只要做出好的提案,就一定會被對方接受買單嗎?那可不一定。在成為幕僚角色的初期,我總認為只要用心做出好提案,就應該會被對方所接受。多年之後,我才明白不是好的提案就會被買單,而是被買單的才是好的提案。
Thumbnail
實踐開放式關係三年多,目前進入穩定關係的員工(男友),年資有三年多到半年多的,共通點是這些員工(男友)全都曾主動表態有「愛到無法分離」的感覺(每個人說法不同,但主要意涵類似),也都讓我有「對方隨時都可以接住我」及「我也隨時都願意接住對方」的感覺。 擁有高度安全感和穩定度的關係,可能也是滿多人在經營關
Thumbnail
根據國際市調機構 Allied Market Research 發佈新報告,全球露營設備的市場規模在 2021 年為 220 億美金,隨著露營越來越受歡迎,以及對於安全、健康等意識提高,預計到 2031 年整體市場將成長至 467 億美金。而根據中華民國露營協會統計,全台常態性露營人口 約有兩百萬人
Thumbnail
完成了交付的工作任務,是不是等於發揮了價值?這其實是許多職場工作者的迷思,只是在幕僚角色身上,這樣的困惑被放大,甚至大到懷疑自己。到底,幕僚的價值是什麼?又要如何具體地被看見?
Thumbnail
◤廣告常說,「打造 #聰明腦,2歲前是關鍵」,難道2歲後學習都無法達到金頭腦了嗎?◢ ►當然不是! 大腦的發展是持續性的,從受孕2週開始到20幾歲都沒停過,所以2歲後還是有可能打造聰明腦喔! ▌那為什麼大家都說2歲是關鍵?
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
前陣子花了一些時間在招募補習班師資管理人員,面試的過程中和許多的求職者聊到如何做好補習班的師資管理,覺得還蠻有收穫的,因此我把這些內容整理出來,跟大家分享~
Thumbnail
了解自己是一輩子的課題。打造個人品牌除了是現在職場的生存法則,也是剛需,但同時也是很能夠幫助自我了解的一個過程。因為最重要的第一步,就是要確認個人品牌定位與標籤!
Thumbnail
在現今數位時代,擁有一個吸引人的網頁設計已成為企業和個人品牌成功的關鍵因素之一。一個出色的網頁設計不僅能提升用戶體驗,更能增加網站的黏著度和轉換率。本文將為您解析如何打造一個出色的網頁設計,以及介紹一些實用的工具,讓您的網頁在競爭激烈的市場中脫穎而出。
Thumbnail
只要做出好的提案,就一定會被對方接受買單嗎?那可不一定。在成為幕僚角色的初期,我總認為只要用心做出好提案,就應該會被對方所接受。多年之後,我才明白不是好的提案就會被買單,而是被買單的才是好的提案。
Thumbnail
實踐開放式關係三年多,目前進入穩定關係的員工(男友),年資有三年多到半年多的,共通點是這些員工(男友)全都曾主動表態有「愛到無法分離」的感覺(每個人說法不同,但主要意涵類似),也都讓我有「對方隨時都可以接住我」及「我也隨時都願意接住對方」的感覺。 擁有高度安全感和穩定度的關係,可能也是滿多人在經營關
Thumbnail
根據國際市調機構 Allied Market Research 發佈新報告,全球露營設備的市場規模在 2021 年為 220 億美金,隨著露營越來越受歡迎,以及對於安全、健康等意識提高,預計到 2031 年整體市場將成長至 467 億美金。而根據中華民國露營協會統計,全台常態性露營人口 約有兩百萬人
Thumbnail
完成了交付的工作任務,是不是等於發揮了價值?這其實是許多職場工作者的迷思,只是在幕僚角色身上,這樣的困惑被放大,甚至大到懷疑自己。到底,幕僚的價值是什麼?又要如何具體地被看見?
Thumbnail
◤廣告常說,「打造 #聰明腦,2歲前是關鍵」,難道2歲後學習都無法達到金頭腦了嗎?◢ ►當然不是! 大腦的發展是持續性的,從受孕2週開始到20幾歲都沒停過,所以2歲後還是有可能打造聰明腦喔! ▌那為什麼大家都說2歲是關鍵?