感谢您抽出时间帮助他人.
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.
我们都查了些什么?
当我们在谷歌上搜索它时.
- 例如,我们希望保留亮状态栏上的深色主题,并使用.preciredColorSolutions修饰符更改应用程序外观.所以这不是一种 Select .
- apply.ToolbarColorSolutions(IOS 16)不起任何作用.
- 管理Info.plist失败.默认情况下,较轻的内容可以 被更改(使用上述方法)
问题
- 为什么这在iOS 16中不起作用?我们是不是做错了什么? (在13至15岁的时间里起到了护身符的作用).
- 有没有什么通用的方法(iOS 13到16),你实际使用和 工作?
- (如果没有)您是否知道仅适用于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
}