【问题标题】:How to show a badge number on a tabItem of a TabView in SwiftUI?如何在 SwiftUI 中的 TabView 的 tabItem 上显示徽章编号?
【发布时间】:2020-02-09 14:46:07
【问题描述】:

我正在使用 SwiftUI 进行一个辅助项目,我有一个场景,我需要在我的 tabItems 之一上显示一个徽章编号 TabView

我已经用我的模型和绑定等设置了所有东西。但是我找了2天找modifier来展示徽章,可惜我所有的研究都遇到了死胡同。

我浏览了TabView 的 Apple SwiftUI API 文档,并在这里搜索了堆栈溢出,当然还有大量的谷歌搜索结果链接。

我正在观察一个包含项目列表的环境对象,并且我知道如何将徽章与我的项目计数绑定,因此当我有任何项目更新(添加、删除)时,徽章将被更新。但我找不到在tabItem 上显示徽章编号的方法。

非常感谢任何帮助!

【问题讨论】:

标签: swift swiftui ios13 tabview


【解决方案1】:

没有用于在标签项上设置徽章编号的修饰符,如果您尝试为此添加自定义视图,它将不可见;这是来自 TabView 文档:

选项卡视图仅支持文本、图像或图像类型的选项卡项 其次是文字。传递任何其他类型的视图会导致可见 但为空标签项。

所以,我尝试了一种解决方法,它有效。 使用 ZStack 与 GeometryReader 和一些计算将自定义徽章视图放置在正确的位置。

struct ContentView: View {
  @State private var badgeNumber: Int = 3
  private var badgePosition: CGFloat = 3
  private var tabsCount: CGFloat = 3

  var body: some View {
    GeometryReader { geometry in
      ZStack(alignment: .bottomLeading) {
        // TabView
        TabView {
          Text("First View")
            .tabItem {
              Image(systemName: "1.circle")
              Text("First")
          }.tag(0)

          Text("Second View")
            .tabItem {
              Image(systemName: "2.circle")
              Text("Second")
          }.tag(1)

          Text("Third View")
            .tabItem {
              Image(systemName: "3.circle")
              Text("Third")
          }.tag(2)
        }

        // Badge View
        ZStack {
          Circle()
            .foregroundColor(.red)

          Text("\(self.badgeNumber)")
            .foregroundColor(.white)
            .font(Font.system(size: 12))
        }
        .frame(width: 20, height: 20)
        .offset(x: ( ( 2 * self.badgePosition) - 1 ) * ( geometry.size.width / ( 2 * self.tabsCount ) ), y: -30)
        .opacity(self.badgeNumber == 0 ? 0 : 1)
      }
    }
  }
}

github 上提供的示例项目: https://github.com/aelzohry/TabBarSwiftUI

【讨论】:

  • 它就像一个魅力,谢谢!我已经调整了徽章的外观以满足我的需要。
  • 不客气。这就是 SwiftUI 中视图的强大之处;您可以根据需要调整它们。
  • 这很好,直到我在我的视图中添加了一个文本字段。当键盘打开并将视图的底部向上移动时,它带来了浮动徽章:/
  • 请注意,在 iOS 14 中,您需要将 .ignoresSafeArea(.keyboard) 添加到封闭的 ZStack 以避免键盘浮动徽章问题。
【解决方案2】:

iOS 15

我们现在可以使用在列表行和标签栏中可用的原生 badge 修饰符:

TabView {
    Text("Tab One")
        .tabItem {
            Text("Home")
            Image(systemName: "house")
        }
        .badge(3)
}

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 2020-10-14
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多