ios - 尝试隐藏选项卡栏 SwiftUI 时出现问题

标签 ios swift swiftui padding swiftui-tabview

像这样的问题已经有好几个了。我在其他答案中没有注意到有一个很小的差异。基本上我有一个 TabView ,它的每个项目都包含在 NavigationView 内。因为它是通过这种方式完成的,而不是相反,首先 NavigationViewTabView 隐藏 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()
        }
    }
}

执行此操作时遇到的问题如下。当我在第一个屏幕上单击按钮时,我会被发送到此处:

Before Rotate

乍一看似乎没有问题。事实上,关闭按钮就像底部有一个看不见的填充物。有趣的是,当我旋转到横向回到全屏时,这个填充消失了。

After rotate

当你看这些图片时,似乎没有问题,但是当你在顶部和底部有一些东西时,当你重新旋转它时,它会被推上并固定。

最佳答案

如果您正在针对 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")
        }
    }
}

enter image description here

关于ios - 尝试隐藏选项卡栏 SwiftUI 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75450229/

相关文章:

ios - Admob 插页式自家广告

swift - 在 Swift Bridging Header 中获取 "file not found"错误

swift - 无法创建 MKCooperativeRegion 对象

ios - 为什么我的 IBOutlet 在 ARC 下发布?

ios - 如何在 uipageviewcontroller swift 中转换时隐藏导航栏

ios - UITableView - 如何在拖放期间更改单元格的背景颜色?

ios - 无法向本地服务器发出HTTPS请求

SwiftUI : I get lost when I try to pass EnvironmentObject to another View when using MVVM

ios - NavigationLink 似乎只占用一点空间

ios - FacebookSDK如何重新提示用户同意?