ios SwiftUI TabView在视图下添加奇怪的空白空间?

wwtsj6pe  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(118)

我正在使用标签页视图更改应用程序中的屏幕。我还使用了一个自定义的标签栏,我创建了导航。
我的问题是标签视图看起来像是在自己下面创建了一个随机的空白空间。我不知道这是不是自定义选项卡视图。
重要提示:需要注意的一点是,如果你点击空白区域的任何地方,它实际上会浏览视图-所以它看起来像是一个不可见的标签栏?
以下是问题的截图:

ContentView:

struct ContentView: View {

@State var selectedTab = 0

var body: some View {
    VStack {
        TabView(selection: $selectedTab) {
            MyGarageView().tag(0)
            FuelView().tag(1)
            FinderView().tag(2)
        }
    }
    ZStack{
        HStack{
            ForEach((TabbedItems.allCases), id: \.self){ item in
                Button{
                    selectedTab = item.rawValue
                } label: {
                    CustomTabItem(imageName: item.iconName, title: item.title, isActive: (selectedTab == item.rawValue))
                }
            }
        }
        .padding(6)
    }
    .frame(height: 75)
    .cornerRadius(15)
    .padding(.horizontal, 26)
  }    

}

CustomTabBarView:

enum TabbedItems: Int, CaseIterable{
    case myGarage = 0
    case fuel
    case map

var title: String{
    switch self {
    case .myGarage:
        return "Garage"
    case .fuel:
        return "Fuel"
    case .map:
        return "Finder"
    }
}

var iconName: String {
    switch self {
    case .myGarage:
        return "garage"
    case .fuel:
        return "fuel"
    case .map:
        return "map"
    }
  }
}

extension ContentView {
func CustomTabItem(imageName: String, title: String, isActive: Bool) -> some View {
    HStack(spacing: 10){
        Spacer()
        Image(imageName)
            .resizable()
            .renderingMode(.template)
            .foregroundColor(isActive ? .white : .gray)
            .frame(width: 20, height: 20)
        if isActive{
            Text(title)
                .font(.system(size: 14))
                .foregroundColor(isActive ? .white : .black)
        }
        Spacer()
    }
    .frame(width: isActive ? 150 : 60, height: 60)
    .background(isActive ? .black : .clear)
    .cornerRadius(15)
  }
}

我试过隐藏选项卡视图,但没有用。
我也试过摆弄框架,但没有效果。
我看不出这个问题,其他帖子/文章也没有帮助。我被卡住了:(

af7jpaap

af7jpaap1#

使用TabView的正常方式是 * 要么 * 有一个标签栏,其中填充了TabItem,* 或 * 使用页面视图样式。

  • 当使用选项卡栏时,可以将TabItem附加到TabView中的每个视图。
  • 当使用页面视图样式时,您可以通过滑动在页面之间移动。这种使用方式没有下面的空白,但它有一个页面指示器(点)来显示您在哪一页。

你没有使用这两种方法。所以没有真实的需要使用TabView
但是,如果您真的想使用TabView,那么解决空白空间的一种方法(当使用.automatic选项卡样式时)是将自定义选项卡栏显示为覆盖。如果选项卡栏的高度大于您试图隐藏的空白空间,则可能需要在TabView下方添加更多填充,以便为自定义选项卡栏留出更多空间。
就像这样:

var body: some View {
    TabView(selection: $selectedTab) {
        MyGarageView().tag(0)
        FuelView().tag(1)
        FinderView().tag(2)
    }
    .padding(.bottom, 30)
    .overlay(alignment: .bottom) {
        HStack{
            ForEach((TabbedItems.allCases), id: \.self){ item in
                Button{
                    selectedTab = item.rawValue
                } label: {
                    CustomTabItem(imageName: item.iconName, title: item.title, isActive: (selectedTab == item.rawValue))
                }
            }
        }
        .padding(6)
        .frame(height: 75)
        .cornerRadius(15)
        .padding(.horizontal, 26)
    }
}

虽然这样做是可行的,但您需要依赖TabView下方的空白区域,因为如果没有空白区域,您的自定义标签栏将与页面内容重叠。因此,您可能需要重新考虑是否真的需要使用TabView
另一种方法是用ZStack替换TabView,然后根据状态变量selectedTab的设置在不同视图之间切换。自定义选项卡栏将以完全相同的方式工作。通过完全避免TabView,您将不会受到TabView布局在未来iOS版本中更改的影响。

相关问题