无法使我的状态栏颜色与 SwiftUI 中的导航栏颜色匹配

Posted

技术标签:

【中文标题】无法使我的状态栏颜色与 SwiftUI 中的导航栏颜色匹配【英文标题】:Cannot make my status bar color to match my UINavigationBar color in SiwftUI 【发布时间】:2021-01-28 18:07:21 【问题描述】:

我的问题似乎很简单。但我只是花了几个小时寻找解决方案! 我只需要使状态栏的背景颜色符合我的UINavigationBar 背景颜色(本示例中为红色)。

我写了一个最小的代码示例来重现我的问题并帮助你给我一个解决方案......

TestApp.swift

import SwiftUI

@main
struct TestApp: App 
    @Environment(\.scenePhase) private var phase

    var body: some Scene 
        WindowGroup 
            ContentView()
        
        .onChange(of: phase)  newPhase in
            switch newPhase 
            case .active:
                UINavigationBar.appearance().backgroundColor = UIColor.red
                break
            default:
                break
            
        
    

ContentView.swift

struct DetailView1: View 

    var body: some View 
        Text("Detail view 1")
    


struct ContentView: View 
    @State private var isDisplayDetailView1 = true

    var body: some View 
        NavigationView 
            List 
                Section 
                    NavigationLink(destination: DetailView1(), isActive: $isDisplayDetailView1) 
                        Text("Go to detail view 1")
                    
                
            
            .navigationBarTitle("Menu")
            .listStyle(GroupedListStyle())
        
            DetailView1()
        
    

显然,我尝试将edgesIgnoringSafeArea(.top) 添加到我的NavigationView 视图(以及ListDetailView1 之一,...),但它并没有改变任何东西...请帮帮我,我不明白问题出在哪里!

【问题讨论】:

【参考方案1】:

你使用ScenePhase是有原因的吗

您可以在file scope添加此代码

extension UINavigationController 
    override open func viewDidLoad() 
        super.viewDidLoad()
        
        let standard = UINavigationBarAppearance()
        standard.backgroundColor = .blue
        
        let compact = UINavigationBarAppearance()
        compact.backgroundColor = .green
        
        let scrollEdge = UINavigationBarAppearance()
        scrollEdge.backgroundColor = .red
        
        navigationBar.standardAppearance = standard
        navigationBar.compactAppearance = compact
        navigationBar.scrollEdgeAppearance = scrollEdge
    

【讨论】:

感谢您的回答!我尝试删除我的 onChangecallback 并添加您的代码。结果是:在“菜单”主视图中,条形图都是系统的浅灰色(或白色?)。只有当我滚动到底部时,它才会变成红色(包括边缘)。 示例中没有Menu。尝试不同的设置可能有developer.apple.com/documentation/uikit/uinavigationbaryalantis.com/blog/… 是的,有:第一个主视图(不是真正的屏幕截图,它代表“详细”视图)。好的,我会看到的。

以上是关于无法使我的状态栏颜色与 SwiftUI 中的导航栏颜色匹配的主要内容,如果未能解决你的问题,请参考以下文章

导航栏中的 SwiftUI 元素不响应状态

为啥ios中的状态栏和导航栏背景颜色不同

ios 7状态栏不继承导航栏颜色

添加 TabView 使导航栏无法覆盖 SwiftUI 中的安全区域

Xcode 13 - swift OS 15 中的导航栏和状态栏文本颜色变化

SwiftUI:Slider 在导航栏项目的前导/尾随时的奇怪行为