如何在 SwiftUI 应用程序生命周期中更改特定视图的状态栏颜色?

Posted

技术标签:

【中文标题】如何在 SwiftUI 应用程序生命周期中更改特定视图的状态栏颜色?【英文标题】:How to change status bar color of a specific view in SwiftUI App Life Cycle? 【发布时间】:2021-09-18 22:13:51 【问题描述】:

我在这里尝试了解决方案:SwiftUI: Set Status Bar Color For a Specific View 和这里:SwiftUI: Set Status Bar Color For a Specific View

这两个解决方案都使用了 SceneDelegate,这在 SwiftUI 2/3 中显然不存在。理想情况下,我希望为特定视图更改颜色。它可能是它们在这些帖子中显示的修饰符,也可能是基于我在称为 AppState 的 Swift 类中的值:

class AppState: NSObject, ObservableObject 
  @Published var currentScreen: Screens = .view1


enum Screens 
  case view1
  case view2
  case view3

在这种情况下,我想让“view2”有一个白色状态栏,但不知道该怎么做——非常感谢任何帮助!

更新:

在我的代码中,我有一个带有 Color.black 的堆栈,该堆栈在此特定视图上具有 .edgesIgnoringSafeArea(.all) 属性,但没有其他属性,因此我需要在此视图中将文本设为白色,但在其他视图中设为黑色...

【问题讨论】:

检查这个:***.com/a/66505930/14733292 @RajaKishan 我并没有尝试更改状态栏的背景,而是尝试更改实际文本/图像的颜色(也就是时间、位置/wifi/电池)使用图标为不同的颜色,但仅限于一个特定的视图) 您找到解决方案了吗?我有同样的问题 【参考方案1】:

您可以更改preferredColorScheme,但这会更改View 的整个方案,而不仅仅是状态栏。字体和背景也会切换。

struct CustomStatusBarView: View 
    @StateObject var appState: AppState = AppState()
    var body: some View 
        ZStack
            Color.gray.ignoresSafeArea()
            VStack
                switch appState.currentScreen
                    
                case .view1:
                    Text("view 1")
                case .view2:
                    Text("view 1").preferredColorScheme(.dark)
                case .view3:
                    Text("view 1")
                
                Button("change view", action: 
                    appState.currentScreen = Screens.allCases.randomElement()!
                )
            
        
    

【讨论】:

我尝试将 .preferredColorScheme(.dark) 修饰符添加到 ContentView 中的最外层视图,但它仍然只更改手机安全区域内的内容(也就是它不会更改内容的文本颜色在状态栏中)。我在整个应用程序中没有其他 colorScheme 修饰符......另外,我想使用 .colorScheme(.dark) 代替,因为我需要强制状态栏中的文本为白色,但这不会改变任何东西: /【参考方案2】:

请尝试将以下键添加到 Info.plist 文件中

<key>UIViewControllerBasedStatusBarAppearance</key> 
<true/>

【讨论】:

以上是关于如何在 SwiftUI 应用程序生命周期中更改特定视图的状态栏颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改应用程序色调颜色(新的 SwiftUI 生命周期应用程序)?

如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?

如何在新的 SwiftUI 应用生命周期中接受 CloudKit 共享?

SwiftUI |如何覆盖 viewWillAppear 等生命周期方法

如何在 SwiftUI 生命周期中删除 macOS 中的最大化、最小化和关闭按钮?

如何将 CoreSpotlight 与 Swiftui 应用生命周期进行深度链接?