swiftUI中标签栏的圆角?

Posted

技术标签:

【中文标题】swiftUI中标签栏的圆角?【英文标题】:Rounded corners for Tab bar in swiftUI? 【发布时间】:2021-02-02 15:04:53 【问题描述】:

我正在尝试给我的标签栏一些圆角,这在 SwiftUI 中被证明是一项艰巨的工作。

我这样创建标签栏:

var body: some View 

TabView 
        homeView()
            .font(.system(size: 30, weight: .bold, design: .rounded))
            .tabItem 
                Image(systemName: "house.fill")
                Text("Home")
            
     
        Text("Bookmark Tab")
            .font(.system(size: 30, weight: .bold, design: .rounded))
            .tabItem 
                Image(systemName: "bookmark.circle.fill")
                Text("Bookmark")
            
     
        Text("Video Tab")
            .font(.system(size: 30, weight: .bold, design: .rounded))
            .tabItem 
                Image(systemName: "video.circle.fill")
                Text("Video")
            
     
        Text("Profile Tab")
            .font(.system(size: 30, weight: .bold, design: .rounded))
            .tabItem 
                Image(systemName: "person.crop.circle")
                Text("Profile")
            
    .edgesIgnoringSafeArea(.top)


我做了很多搜索,找到了很多 UIKit 的答案/解决方案,但对 SwiftUI 没有任何价值。

虽然,我为 SwiftUI 找到了一些解决方案,但它们似乎在创建“自定义”标签栏,这似乎是一种矫枉过正的做法,并且给人一种重新发明***的印象!

有没有什么方法可以在 SwiftUI 中做到这一点,而无需像从头开始创建整个标签栏一样重新设计***?

编辑:

【问题讨论】:

【参考方案1】:

首先: 我创建了 TabBarView.swift 文件。 代码:

import SwiftUI

struct TabBarView: View 
    
    @State var selectedTab = "Yeni Mesajlar"
    @Binding var pages: [TabBarPage]
    init(pages: Binding<[TabBarPage]>) 
        UITabBar.appearance().isHidden = true
        self._pages = pages
    
    var body: some View 
        ZStack(alignment: .bottom) 
            
            TabView(selection: $selectedTab) 
                
                ForEach(pages)  item in
                    AnyView(_fromValue: item.page)
                        
                        .tabItem
                            EmptyView()
                        .tag(item.tag)
                
            
            
            HStack 
                ForEach(pages)  item in
                    Button(action: 
                        self.selectedTab = item.tag
                    ) 
                        ZStack 

                            
                            Image(systemName: item.icon)
                                .foregroundColor(item.color)
                                .imageScale(.large)
                                .padding(7)
                                .background(self.selectedTab == item.tag ? Color.gray : item.color )
                                .mask(Circle())
                        
                    
                    .frame(maxWidth: .infinity)
                
            
            .padding(5)
            .background(Color.orange)
            .cornerRadius(15)
            .padding()
        
        
        
    


struct TabBarView_Previews: PreviewProvider 
    static var previews: some View 
        TabBarView(pages: .constant([TabBarPage(page: HomeView(), icon: "arrow.up.message.fill", tag: "Yeni Mesajlar", color: .green),
                                     TabBarPage(page: DetailView(), icon: "message.fill", tag: "Mesajlar", color: .yellow),
                                     TabBarPage(page: ProfileView(), icon: "person.crop.circle.fill", tag: "Profil", color: .blue)]))
    


struct TabBarPage: Identifiable 
    var id = UUID()
    var page: Any
    var icon: String
    var tag: String
    var color: Color

那么:

我将创建的 TabView 添加到 ContentView。 代码:

struct ContentView: View 
    @State var tabBarPages: [TabBarPage] = [TabBarPage(page: NewMessageView(), icon: "arrow.up.message.fill", tag: "Yeni Mesajlar", color: .green),
                                            TabBarPage(page: MessageView(), icon: "message.fill", tag: "Mesajlar", color: .yellow),
                                            TabBarPage(page: ProfileView(), icon: "person.crop.circle.fill", tag: "Profil", color: .blue)]
    var body: some View 
        TabBarView(pages: $tabBarPages)
    

【讨论】:

这种工作方式符合我的需要,但粉色标签栏后面有白色背景!你看到了吗?如果 View 的背景是白色的,则看不到它。 我现在要回家了。先生,我会给你发短信。

以上是关于swiftUI中标签栏的圆角?的主要内容,如果未能解决你的问题,请参考以下文章

IOS 7中标签栏图标的选定状态

取消选择或取消选择iOS 5中标签栏中的所有标签

如何在 Javafx 中展开标签栏

更改标签栏的高度和宽度并添加圆角

如何在 SwiftUI 的标签栏的特定视图中隐藏导航栏?

如何更改选中和未选中的标签栏图像颜色