我一直在尝试为单个视图设置应用程序的状态栏颜色。
我已经尝试过此处列出的解决方案..'https://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios/17768797#17768797'但这将其设置为整个应用程序。
我希望状态栏颜色对于在 SceneDelegate.swift 中设置的 rootViewController 具有白色文本,然后对所有其他视图进行默认设置(根据暗模式从白色更改为黑色)。
有任何想法吗?
状态栏内容颜色可以基于每个视图控制器进行修改,但 SwiftUI 最通常只使用一个视图控制器,即根托管视图控制器。所以它需要推动根控制器进行更改preferredStatusBarStyle
属性,在基类中是只读的。
所以想法是覆盖默认值UIHostingController
有可能改变这一点preferredStatusBarStyle
价值和使用习惯Environment
值,以便任何内部 SwiftUI 子视图都可以修改首选内容样式。
这是方法,scratchy,(假设目标 Info.plist 已正确配置)
class LocalStatusBarStyle { // style proxy to be stored in Environment
fileprivate var getter: () -> UIStatusBarStyle = { .default }
fileprivate var setter: (UIStatusBarStyle) -> Void = {_ in}
var currentStyle: UIStatusBarStyle {
get { self.getter() }
set { self.setter(newValue) }
}
}
// Custom Environment key, as it is set once, it can be accessed from anywhere
// of SwiftUI view hierarchy
struct LocalStatusBarStyleKey: EnvironmentKey {
static let defaultValue: LocalStatusBarStyle = LocalStatusBarStyle()
}
extension EnvironmentValues { // Environment key path variable
var localStatusBarStyle: LocalStatusBarStyle {
get {
return self[LocalStatusBarStyleKey.self]
}
}
}
// Custom hosting controller that update status bar style
class MyHostingController<Content>: UIHostingController<Content> where Content: View {
private var internalStyle = UIStatusBarStyle.default
@objc override dynamic open var preferredStatusBarStyle: UIStatusBarStyle {
get {
internalStyle
}
set {
internalStyle = newValue
self.setNeedsStatusBarAppearanceUpdate()
}
}
override init(rootView: Content) {
super.init(rootView:rootView)
LocalStatusBarStyleKey.defaultValue.getter = { self.preferredStatusBarStyle }
LocalStatusBarStyleKey.defaultValue.setter = { self.preferredStatusBarStyle = $0 }
}
@objc required dynamic init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Usage..
- 场景委托中的某处
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// ...
window.rootViewController = MyHostingController(rootView: contentView)
- 内容视图中的某处
struct ContentView: View {
@Environment(\.localStatusBarStyle) var statusBarStyle
...
var body: some View {
ZStack {
....
NavigationView {
NavigationLink(destination: ...) {
...
}
.onAppear {
self.statusBarStyle.currentStyle = .lightContent
}
.onDisappear {
self.statusBarStyle.currentStyle = .default
}
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)