如何在 SwiftUI 中隐藏状态栏

How to hide the status bar in SwiftUI

我想在 SwiftUI 中隐藏状态栏。 "statusBar(hidden: true)"这个方法我试过了,还是不行。有什么办法可以在SwiftUI中实现吗

演示代码如下:

var body: some View {
        VStack {
            Text("Hello World")

        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
        .background(Color.blue)
        .edgesIgnoringSafeArea(.all)
        .statusBar(hidden: true)

    }
.edgesIgnoringSafeArea(.all)
.statusBar(hidden: true)

试试这个

您可以通过几种不同的方式隐藏 SwiftUI 项目中的状态栏,具体取决于您的意图。我列出了一些,没有特别的顺序。所有示例都使用 iOS 13 & iOS 14 使用 Xcode 11 & Xcode 12,但 OPTION-2 除外。

选项-1
在你的 info.plist 文件中确保你有这些设置:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

添加以下 UIViewController 扩展

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

OPTION-2(仅iOS 14 & Xcode 12)
在你的 info.plist 文件中确保你有这些设置:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

按照 link 中的描述将 AppDelegate 添加到 SwiftUI 应用程序,但添加下面提到的行。 https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-an-appdelegate-to-a-swiftui-app

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        UIApplication.shared.isStatusBarHidden = true // <== ADD THIS LINE
        return true
    }
}

请注意,您会收到已弃用的呼叫警告,但它应该仍然有效。

选项-3
在你的 info.plist 文件中确保你有这些设置:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

确保您的初始 SwiftUI 视图是隐藏状态栏的导航视图。然后,如果您导航到标签栏视图或任何后续视图,状态栏将被隐藏。

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: MyTabView()) {
                Text("Go To Tabview")
            }
        }
        .edgesIgnoringSafeArea(.all)
        .statusBar(hidden: true)
    }
}

struct MyTabView: View {
    var body: some View {
        TabView {
            TabView1().tabItem {
                Text("Tab 1")
            }

            TabView2().tabItem {
                Text("Tab 2")
            }
        }
    }
}

struct TabView1: View {
    var body: some View {
        Text("Tab View 1")
    }
}

struct TabView2: View {
    var body: some View {
        Text("Tab View 2")
    }
}

选项-4
使用 UIStatusBarManager https://developer.apple.com/documentation/uikit/uistatusbarmanager

iOS14、SwiftUI

我发现,在 iOS14 中最有效的方法是进入 info.plist。但是,此方法始终有效,这意味着如果您想要 return 单击 UIButton 时的状态栏,则此方法不适合您。

对我来说,它适用于整个应用程序,无论是否使用 NavigationView 实例。

打开您的 Info.plist "as Source Code"(见下图)并将这四行粘贴到其中:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

问题最终在 Xcode 13.0 beta 3 中得到解决 - 您可以将 statusBarHidden 修饰符附加到 TabView 和 NavigationView,状态栏会按预期隐藏。

我发现使它在每个视图中工作的唯一方法是将您的 rootView 包装在 HostingController 中,例如:

class HostingController<ContentView>: UIHostingController<ContentView> where ContentView : View {

    

    init(view: ContentView) {

        super.init(rootView: view)



        NotificationCenter.default.addObserver(forName: .onDarkStatusBar, object: nil, queue: .main) { _ in

            self.statusBarEnterDarkBackground()

        }

        

        NotificationCenter.default.addObserver(forName: .onLightStatusBar, object: nil, queue: .main) { _ in

            self.statusBarEnterLightBackground()

        }

        

        NotificationCenter.default.addObserver(forName: .onShowStatusBar, object: nil, queue: .main) { _ in

            self.statusBarShow()

        }

        

        NotificationCenter.default.addObserver(forName: .onHideStatusBar, object: nil, queue: .main) { _ in

            self.statusBarHide()

        }

    }

    

    @objc required dynamic init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    

    private var isDarkContentBackground = false

    private var isStatusBarHiden = false



    func statusBarEnterDarkBackground() {

        isDarkContentBackground = false

        setNeedsStatusBarAppearanceUpdate()

    }



    func statusBarEnterLightBackground() {

        isDarkContentBackground = true

        setNeedsStatusBarAppearanceUpdate()

    }

    

    func statusBarHide() {

        isStatusBarHiden = true

        setNeedsStatusBarAppearanceUpdate()

    }



    func statusBarShow() {

        isStatusBarHiden = false

        setNeedsStatusBarAppearanceUpdate()

    }



    override var preferredStatusBarStyle: UIStatusBarStyle {

        if isDarkContentBackground {

            return .lightContent

        }

        else

        {

            return .darkContent

        }

    }

    

    override var prefersStatusBarHidden: Bool {

      return isStatusBarHiden

    }



}

用作

let window = UIWindow(windowScene: windowScene)

            window.rootViewController = HostingController(view: contentView)

然后从onDissapear和onAppear发出通知。

extension Notification.Name {

   static let onDarkStatusBar = Notification.Name("onDarkStatusBar")

    static let onLightStatusBar = Notification.Name("onLightStatusBar")

    static let onHideStatusBar = Notification.Name("onHideStatusBar")

    static let onShowStatusBar = Notification.Name("onShowStatusBar")

}

正在使用

                            .onAppear {

                                NotificationCenter.default.post(name: Notification.Name.onHideStatusBar, object: nil)

                            }

                            .onDisappear {

                                NotificationCenter.default.post(name: Notification.Name.onShowStatusBar, object: nil)

                            }