我想在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)
}
答案 0 :(得分:4)
.edgesIgnoringSafeArea(.all)
.statusBar(hidden: true)
是的。可行。
答案 1 :(得分:2)
我发现,iOS14 中最有效的方法是进入 info.plist
。但是,此方法一直有效,这意味着如果您想在单击 UIButton 时返回 statusBar,则此方法不适合您。
对我来说,它适用于整个应用程序,无论是否使用 NavigationView 的实例。
打开您的 Info.plist “作为源代码”(见下图)并将这四行粘贴到其中:
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
答案 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)
我刚刚尝试过,它的工作原理完全符合预期。