0

我正在使用 Introspect 在 SwiftUI 中隐藏子视图上的 TabBar。但是,我注意到一些奇怪的行为。

导航到子视图时,TabBar 似乎仍然继续占用空间,但是当应用程序后台运行或打开控制中心/通知中心时,空间消失了。

在某些情况下,问题只发生在子视图中,但在大多数情况下,它也会发生在父视图中。以下是执行此操作的步骤:

  • 导航到子视图。
  • 将应用移至后台。
  • 再次打开应用程序。您会注意到绿色视图被推到了底部。
  • 现在回到父视图。该空间也消失了,如果我们真的有一个 tabBar 显示,绿色视图将在 tabBar 后面!

我还使用@EnvironmentObject了不同视图中的 TabBar 隐藏控件,问题仍然存在。

在某些情况下,使用.edgesIgnoringSafeArea(.bottom)使子视图在底部进入某种“全屏”状态,实际上解决了问题,但是对于选项卡式视图,绿色视图仍然位于 TabBar 的后面。

如果有一种方法可以知道选项卡视图上的 tabBar 高度并始终将填充设置为.padding(.bottom, self.tabBarHeight)或类似的东西,我认为可以通过这种解决方法解决问题,但是仍然需要隐藏 TabBar 的工作量太大。

这是一个测试行为的代码示例:

import SwiftUI
import Introspect

struct ContentView: View {

    @State var goToChildView: Bool = false

    var body: some View {
        TabView {  // this happens with UITabBar too (UITabBarWrappers from UIKit)
            NavigationView {
                VStack {
                    Spacer()

                    NavigationLink(
                        destination: ChildView(),
                        isActive: $goToChildView,
                        label: {
                            Text("Navigate to child view")
                                .font(.title)
                        })
                        .padding()
                        .background(Color.gray)

                    HStack {

                        Spacer()

                        Text("This view is pushed down")

                        Spacer()
                    }
                    .frame(height: 100, alignment: .center)
                    .background(Color.green)

                }
                .introspectTabBarController { tabBarController in
                    tabBarController.tabBar.isHidden = false
                }
            }
        }
    }
}

struct ChildView: View {
    var body: some View {
        VStack {
            Spacer()

            HStack {

                Spacer()

                Text("This view is pushed down")

                Spacer()
            }
            .frame(height: 100, alignment: .center)
            .background(Color.green)
        }
        .introspectTabBarController { tabBarController in
            tabBarController.tabBar.isHidden = true
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

4

0 回答 0