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

4
我尝试了这里提供的解决方案:SwiftUI:为特定视图设置状态栏颜色 和这里:SwiftUI:为特定视图设置状态栏颜色 这两个解决方案都使用SceneDelegate,但在SwiftUI 2/3中它显然不存在。理想情况下,我希望针对特定视图更改颜色。它可以是像那些帖子中展示的修改器,也可以基于我在称为AppState的Swift类中拥有的值。
class AppState: NSObject, ObservableObject {
  @Published var currentScreen: Screens = .view1
}

enum Screens {
  case view1
  case view2
  case view3
}

我想让在这个案例中的"view2"有一个白色的状态栏,但不确定如何实现 - 非常感谢您的帮助!

更新:

在我的代码中,我有一个Stack,其中包含一个Color.black,它具有.edgesIgnoringSafeArea(.all)属性,只针对此特定的视图而非其他视图。因此,我需要使该视图中的文本为白色,而其他视图为黑色...

Demo


请查看此链接:https://dev59.com/sb_qa4cB1Zd3GeqPO8RM#66505930 - Raja Kishan
@RajaKishan 我并不是试图改变状态栏的背景,我试图改变实际文本/图像的颜色(也就是将时间、位置/ WiFi /电池使用图标变成不同的颜色,但仅适用于一个特定的视图)。 - nickcoding2
1
你找到解决方案了吗?我也有同样的问题。 - Niklas
2个回答

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 中最外层的 View 中,但仍然只更改手机安全区域内的内容(也就是说,它不会更改状态栏中的文本颜色)。我在整个应用程序中没有其他 colorScheme 修改器...另外,我想使用 .colorScheme(.dark) ,因为我需要强制状态栏中的文本为白色,但这并没有改变任何东西 :/ - nickcoding2

1
请尝试将以下密钥添加到Info.plist文件中。
<key>UIViewControllerBasedStatusBarAppearance</key> 
<true/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接