我正在使用 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()
}
}