<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在UIKit中設定多個tabbar展示需要使用到UITabBarController
在SwiftUI中 由TabView
元件來進行實現,同時TabView
也可以實現PageViewController的效果,
import SwiftUI struct ZTMinePageView: View { var body: some View { TabView{ Text("設定一").tabItem { Image(systemName: "arkit").foregroundColor(.red) Text("設定一") } Text("設定二").tabItem { Image(systemName: "star") Text("設定二") } Text("設定三").tabItem { Image(systemName: "star").foregroundColor(.red) Text("設定三") } Text("設定四").tabItem { Image(systemName: "star").foregroundColor(.red) Text("設定四") } } } }
tabview此時不會繫結對應的selectedIndex,只能在初始化的時候設定對應的index,不能動態設定要展示的tabbar的index,
除了上面的點選tabview切換檢視,SwiftUI
還允許我們使用狀態來控制當前檢視。為此 我們需要四步
@State
屬性Binding
的形式傳給TabView,便於自動跟蹤具體的如下:
import SwiftUI struct ZTTestPageView: View { @State private var selectedTab = 0 var body: some View { TabView(selection: $selectedTab){ Text("設定一").tabItem { Image(systemName: "arkit").foregroundColor(.red) Text("設定一") }.onTapGesture { self.selectedTab = 3 }.tag(0) Text("設定二").tabItem { Image(systemName: "star") Text("設定二") }.tag(1) Text("設定三").tabItem { Image(systemName: "star").foregroundColor(.red) Text("設定三") }.tag(2) Text("設定四").tabItem { Image(systemName: "star").foregroundColor(.red) Text("設定四") }.tag(3) } } }
上面程式碼中當我們點選 設定一介面中的text 這時會修改selectedTab
,而我們在上面把TabView
和selectedTab
繫結到一起了,修改selectedTab
的值 TabView
也會切換對應展示的檢視。
在上面的用法中沒有辦法對TabbarItem
中的圖片做選中和非選中的切換,上面截圖中的變化只是系統對選中和非選中的一個顏色的處理,事實上我們的圖片都是同一個。在實際專案中,點選tabbar切換檢視 底部的圖片也會跟著變化,而且在其他介面中也會動態的修改當前TabView
的index。
TabView
和環境變數相互繫結,有一方修改 其他方也會跟著變化1.定義一個全域性的環境變數
import SwiftUI import Combine final class TabBarIndexObserver: ObservableObject { @Published var tabSelected: TabBarItem = .Home }
2.定義為全域性的環境變數 @EnvironmentObject
import SwiftUI @main struct SwiftUITestApp: App { var body: some Scene { WindowGroup { ContentView().environmentObject(TabBarIndexObserver()) } } }
3.繫結TabView
和環境變數,其中要自己自定義一個TabBarItem
物件,主要是根據當前TabView
中的index 返回 image 和 title,每個展示的檢視都要設定tag 否則繫結檢視一直展示的都是0,不會切換到其他檢視。圖片資源可以自己設定。
import SwiftUI enum TabBarItem: Int { case Home case Living case Message case Mine var titleStr: String { switch self { case .Home: return "首頁" case .Living: return "直播" case .Message: return "訊息" case .Mine: return "我的" } } var normalImage: Image { var imageName = "" switch self { case .Home: imageName = "" case .Living: imageName = "" case .Message: imageName = "" case .Mine: imageName = "" } return Image(imageName) } var selectedImage: Image { var imageName = "" switch self { case .Home: imageName = "" case .Living: imageName = "" case .Message: imageName = "" case .Mine: imageName = "" } return Image(imageName) } }
在TabView
中進行對應的設定,給每一個檢視設定一個唯一的標識,用這個識別符號作為被選中的tab,這些識別符號被稱為Tag
import SwiftUI struct ContentView: View { @EnvironmentObject private var tabbarIndex: TabBarIndexObserver private var selectedTab: Binding<Int> { Binding( get: { tabbarIndex.tabSelected.rawValue }, set: { tabbarIndex.tabSelected = TabBarItem(rawValue: $0)! } ) } // 設定對應的normal 和 selected圖片 要設定TabView 繫結狀態 和 每個View的tag值,在點選的時候把值傳遞給對應的view var body: some View { TabView(selection: selectedTab) { ZTHomePageView() .tabItem {tabItem(for: .Home)} .tag(TabBarItem.Home.rawValue) ZTLivingPageView() .tabItem {tabItem(for: .Living)} .tag(TabBarItem.Living.rawValue) ZTMessagePageView() .tabItem {tabItem(for: .Message)} .tag(TabBarItem.Message.rawValue) ZTMinePageView() .tabItem { tabItem(for: .Mine) } .tag(TabBarItem.Mine.rawValue) } .font(.headline) .accentColor(Color.red) // 設定 tab bar 選中顏色 } private func tabItem(for tab: TabBarItem) -> some View { print(selectedTab.wrappedValue) return VStack { tab.rawValue == selectedTab.wrappedValue ? tab.selectedImage : tab.normalImage Text(tab.titleStr) } } }
TabView
實現輪播圖時不用設定tabItem 需要指定tabView的顯示型別為.tabViewStyle(PageTabViewStyle())
具體程式碼如下
struct ZTMinePageView: View { //設定定時器 每2s執行一次 mode為 common 在主執行緒執行 autoconnect 立即開始定時器 let timer = Timer.publish(every: 2, tolerance: 0.5, on: .main, in: .common).autoconnect() @State private var bannerIndex = 0 var body: some View { if #available(iOS 15.0, *) { TabView(selection: $bannerIndex){ Image("test_1").resizable().scaledToFit().tag(0) Image("test_2").resizable().scaledToFit().tag(1) Image("test_3").resizable().scaledToFit().tag(2) Image("test_4").resizable().scaledToFit().tag(3) } .background(Color(red: 0.5, green: 0.9, blue: 0.3, opacity: 0.3)) .tabViewStyle(PageTabViewStyle(indexDisplayMode: .always)) .onReceive(timer){ time in self.bannerIndex += 1 if self.bannerIndex > 3{ self.bannerIndex = 0 } } .onAppear{ }.onDisappear{ self.timer.upstream.connect().cancel() } } else { } } }
其中設定了一個定時器,具體效果如下,如果想要動畫 可以自己加上去
到此這篇關於SwiftUI中TabView元件常規使用的文章就介紹到這了,更多相關SwiftUI TabView使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45