像这样的问题已经有好几个了。我在其他答案中没有注意到有一个很小的差异。基本上我有一个 TabView
,它的每个项目都包含在 NavigationView
内。因为它是通过这种方式完成的,而不是相反,首先 NavigationView
和 TabView
隐藏 View 的方法并不那么简单。
extension UIView {
func allSubviews() -> [UIView] {
var allSubviews = subviews
for subview in subviews {
allSubviews.append(contentsOf: subview.allSubviews())
}
return allSubviews
}
}
extension UITabBar {
private static var originalY: Double?
static public func changeTabBarState(shouldHide: Bool) {
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
windowScene?.windows.first(where: { $0.isKeyWindow })?.allSubviews().forEach({ view in
if let tabBar = view as? UITabBar {
if !tabBar.isHidden && shouldHide {
originalY = tabBar.frame.origin.y
tabBar.frame.origin.y = UIScreen.main.bounds.height + 200
} else if tabBar.isHidden && !shouldHide {
guard let originalY else {
return
}
tabBar.frame.origin.y = originalY
}
tabBar.isHidden = shouldHide
}
})
}
}
struct MyTabView: View {
@Environment(\.colorScheme) var colorScheme
@State var toggle = false
var body: some View {
TabView {
NavigationView {
ContentView(toggle: $toggle)
}
.tabItem {
Text("Profile")
.foregroundColor(colorScheme == .dark ? .white : .black)
}
}
.accentColor(colorScheme == .dark ? .white : .black)
.navigationBarTitleDisplayMode(.inline)
}
}
struct ContentView: View {
@Binding var toggle: Bool
var body: some View {
NavigationLink(isActive: $toggle, destination: {
Button("dismiss") {
UITabBar.changeTabBarState(shouldHide: false)
toggle.toggle()
}
.navigationBarBackButtonHidden()
.navigationBarHidden(true)
.onAppear {
UITabBar.changeTabBarState(shouldHide: true)
}
}, label: {
Text("Click")
})
}
}
@main
struct AppTestingOne: App {
var body: some Scene {
WindowGroup {
MyTabView()
}
}
}
执行此操作时遇到的问题如下。当我在第一个屏幕上单击按钮时,我会被发送到此处:
乍一看似乎没有问题。事实上,关闭按钮就像底部有一个看不见的填充物。有趣的是,当我旋转到横向回到全屏时,这个填充消失了。
当你看这些图片时,似乎没有问题,但是当你在顶部和底部有一些东西时,当你重新旋转它时,它会被推上并固定。
最佳答案
如果您正在针对 iOS 16 进行构建,则只需使用
.toolbar(.hidden, for: .tabBar)
示例:
struct ContentView: View {
var body: some View {
TabView() {
FirstScreen()
NavigationStack {
Text("second")
.navigationTitle("second")
}
.tabItem {
Label("second", systemImage: "2.circle")
}
NavigationStack {
Text("third")
.navigationTitle("third")
}
.tabItem {
Label("third", systemImage: "3.circle")
}
}
}
}
struct FirstScreen: View {
@State private var hideTabBar = false
var body: some View {
NavigationStack() {
VStack {
Button("Toggle tab bar") {
withAnimation {
hideTabBar.toggle()
}
}
.padding()
Spacer()
}
.navigationTitle("first")
}
.toolbar(hideTabBar ? .hidden : .visible, for: .tabBar)
.tabItem {
Label("first", systemImage: "1.circle")
}
}
}
关于ios - 尝试隐藏选项卡栏 SwiftUI 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75450229/