如何在 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)
}
我想在 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)
}