iOS 16 中的状态栏颜色

Mgl*_*aRu 6 ios swift swiftui

感谢您花时间帮助他人。

这是原帖,我发布在这里也希望有更好的运气。谢谢!

问题描述:

我们的 SwiftUI 应用程序最低部署是 iOS 14。仅在 iOS 16 中,我们就一直在努力解决状态栏颜色问题。

我们无法将其颜色/外观从浅色更改为深色。

以前的有效解决方案(iOS 13 到 iOS 15)

从现在开始,我们习惯用...来管理外观。

1-当给定条件时,在特定视图中调用,例如不支持暗模式,或者侧菜单已打开

UIApplication.setStatusBarStyle(.darkContent)
Run Code Online (Sandbox Code Playgroud)

2- 在任何 SwiftUI 视图上支持此功能的扩展

import UIKit

extension UIApplication {
    class func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let controller = UIApplication.getKeyWindow()?.rootViewController as? ContentHostingController {
            controller.changeStatusBarStyle(style)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3-实际上,控制器类

import SwiftUI
import UIKit

class ContentHostingController: UIHostingController<AnyView> {

  private var currentStatusBarStyle: UIStatusBarStyle = .default

  override var preferredStatusBarStyle: UIStatusBarStyle {
    currentStatusBarStyle
  }

  func changeStatusBarStyle(_ style: UIStatusBarStyle) {
    self.currentStatusBarStyle = style
    self.setNeedsStatusBarAppearanceUpdate()
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,正如我所说,这在 iOS 16 上不再起作用。

我们检查了什么?

当我们用谷歌搜索它时...

  1. 使用 .preferredColorScheme 修饰符更改应用程序外观,例如,我们希望保留浅色状态栏上的深色主题。所以这不是一个选择。
  2. 应用 .toolbarColorScheme (iOS 16),什么也不做。
  3. 管理 Info.plist 没有成功。默认为浅色内容,可更改(用上述方法)

问题

  1. 为什么这在 iOS 16 中不起作用?我们做错了什么吗?(对于 13 到 15 岁来说,效果非常好)。
  2. 您是否有实际使用和工作的通用(iOS 13 至 16)方式?
  3. (如果没有)您知道仅在 16 号申请的解决方法吗?

最终解决方案(由@ashley-mills 提出并由我改进):

首先,一个视图扩展来保持干净:

func iOS16navBarAdapter(_ colorScheme: ColorScheme) -> some View {
        if #available(iOS 16, *) {
            return self
                .toolbarBackground(Color.navigationBar, for: .navigationBar)
                .toolbarBackground(.visible, for: .navigationBar)
                .toolbarColorScheme(colorScheme, for: .navigationBar)
        } else {
            return self
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以在您的视图中按如下方式使用:

@State private var iOS16colorScheme: ColorScheme = .dark

...

VStack {
    ...
}
.iOS16navBarAdapter(iOS16colorScheme)
.onChange(of: globalSideMenu.xCoord) { value in
    iOS16colorScheme = value > sideMenuOffset ? .light : .dark
}
Run Code Online (Sandbox Code Playgroud)

Ash*_*lls 5

有多种方法可以更改状态栏颜色。

从这个开始View

struct ContentView: View {

    var body: some View {
        ZStack {
            Color.mint
                .ignoresSafeArea()
            Text("Hello")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并设置以下info.plist键:

  • 查看基于控制器的状态栏外观:

  • 状态栏样式:深色内容

给出:

在此输入图像描述

改变

  • 状态栏样式:浅色内容

给出:

在此输入图像描述

您还可以在每个视图的基础上更改状态栏文本颜色,确保您设置

  • 查看基于控制器的状态栏外观:

然后将视图包装在 a 中NavigationStack,并添加以下toolbar修饰符:


.toolbarBackground(.mint, for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
.toolbarColorScheme(<colorScheme>, for: .navigationBar)

Run Code Online (Sandbox Code Playgroud)

例如:

struct ContentView: View {
    
    var body: some View {
        NavigationStack {
            TestView(colorScheme: .dark)
        }
    }
}

struct TestView: View {
    
    let colorScheme: ColorScheme
    
    var body: some View {
        ZStack {
            Color.mint
                .ignoresSafeArea()
            VStack {
                Text("Hello")
                NavigationLink("Push") {
                    TestView(colorScheme: .dark)
                }
            }
        }
        .toolbarBackground(.mint, for: .navigationBar)
        .toolbarBackground(.visible, for: .navigationBar)
        .toolbarColorScheme(colorScheme, for: .navigationBar)
    }
}
Run Code Online (Sandbox Code Playgroud)

给出:

在此输入图像描述