如何在SwiftUI中隐藏状态栏

时间:2019-07-05 04:50:59

标签: hide statusbar 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)

    }

6 个答案:

答案 0 :(得分:4)

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

是的。可行。

答案 1 :(得分:2)

iOS 14,SwiftUI

我发现,iOS14 中最有效的方法是进入 info.plist。但是,此方法一直有效,这意味着如果您想在单击 UIButton 时返回 statusBar,则此方法不适合您。

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

打开您的 Info.plist “作为源代码”(见下图)并将这四行粘贴到其中:

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

enter image description here

答案 2 :(得分:0)

您可以根据自己的意图在SwiftUI项目中隐藏状态栏的几种方法。我没有按照特定顺序列出一些。除了 OPTION-2 之外,所有示例都使用Xcode 11和Xcode 12在iOS 13和iOS 14上正常工作。

OPTION-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/>

如此链接中所述,将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
    }
}

请注意,您将收到已弃用的通话警告,但该警告仍将起作用。

OPTION-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")
    }
}

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我发现让每个视图都能正常工作的唯一方法是将您的 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)

                            }

答案 5 :(得分:-1)

我刚刚尝试过,它的工作原理完全符合预期。