感谢您抽出时间帮助他人.

100, I publish here also hoping for better luck. Thanks!

问题描述:

我们的SwiftUI应用程序的最小部署是iOS 14.仅在iOS 16中,我们就一直在努力解决status bar色的问题.

We can't change its color/appearance from light to dark.

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

因为现在我们习惯于用……来管理外观.

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

UIApplication.setStatusBarStyle(.darkContent)

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

import UIKit

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

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()
  }
}

But,正如我所说,这不再适用于iOS16.

我们都查了些什么?

当我们在谷歌上搜索它时.

  1. 例如,我们希望保留亮状态栏上的深色主题,并使用.preciredColorSolutions修饰符更改应用程序外观.所以这不是一种 Select .
  2. apply.ToolbarColorSolutions(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
        }
    }

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

@State private var iOS16colorScheme: ColorScheme = .dark

...

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

推荐答案

有几种方法可以更改状态栏的 colored颜色 .

从这View个开始:

struct ContentView: View {

    var body: some View {
        ZStack {
            Color.mint
                .ignoresSafeArea()
            Text("Hello")
        }
    }
}

并设置以下info.plist个关键点:

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

  • 状态栏样式:Dark Content

提供:

enter image description here

正在改变

  • 状态栏样式:Light Content

提供:

enter image description here

您还可以根据每个视图更改状态栏文本 colored颜色 ,确保您设置了

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

然后将您的视图包装为NavigationStack,并添加以下toolbar个修改器:


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

例如:

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)
    }
}

提供:

enter image description here

Ios相关问答推荐

如何保持拖动预览与原始项目完全相同?

自定义油漆圆角三角形

如何在SwiftUI中以一定Angular 绘制直线(&A)

IFrame内容拒绝仅在iOS浏览器上加载-即使发布了内容-安全-策略(CSP)框架-祖先指令

UITableViewCell编程约束问题

SwiftData在获取值时应用程序崩溃:线程1:EXC_BREAKPOINT(代码=1,子代码=0x101e8303c)

在flatter_riverpod中,如果没有ref对象,我们如何访问提供程序?

Flutter应用内购买无法恢复购买

当虚拟对象附加到其网格时,如何刷新创建 ARView 的 SwiftUI UIViewRepresentable?

创建方案时运行 pod install 时出错

SwiftUI HStack 文本字段对齐

iOS SwiftUI - 使用 PhotosPicker 从图库中 Select 图像或视频

NSFetchedResultsController 由字符串的第一个字母创建的部分

Xcode 4 + iOS 4.3:存档类型不存在打包程序

aps-environment 始终在发展

Xcode / iOS模拟器:手动触发重大位置更改

以编程方式创建按钮并设置背景图像

Sierra 中的安全/协同设计: keys 串忽略访问控制设置和 UI 提示权限

Select 器touchesBegan:withEvent:的覆盖方法具有不兼容的类型(NSSet,UIEvent)->()

如何为 iOS 13 的 SF Symbols 设置权重?