SwiftUI中如何获取displayGamut?原生方法或UIKit层传入方案
SwiftUI中获取Display Gamut的解决方案
一、直接在SwiftUI中获取(无需依赖嵌入的UIKit层)
SwiftUI目前没有原生的@Environment属性直接暴露displayGamut,但可以直接调用UIKit的API在SwiftUI视图中获取当前上下文的显示色域:
// 在SwiftUI视图中直接获取当前色域 let currentGamut = UITraitCollection.current.displayGamut
如果需要监听色域变化,可通过屏幕trait变化通知实现动态更新:
struct ContentView: View { @State private var displayGamut: UIScreen.DisplayGamut = UITraitCollection.current.displayGamut var body: some View { Text("当前色域: \(displayGamut.rawValue)") .onReceive(NotificationCenter.default.publisher(for: UIScreen.traitCollectionDidChangeNotification)) { _ in displayGamut = UITraitCollection.current.displayGamut } } }
二、从嵌入的UIKit层传递至SwiftUI
如果你的SwiftUI视图是通过UIHostingController嵌入到UIKit中的,可以通过自定义EnvironmentKey将displayGamut注入SwiftUI环境,实现双向同步:
- 定义自定义EnvironmentKey
struct DisplayGamutKey: EnvironmentKey { static let defaultValue: UIScreen.DisplayGamut = .sRGB } extension EnvironmentValues { var displayGamut: UIScreen.DisplayGamut { get { self[DisplayGamutKey.self] } set { self[DisplayGamutKey.self] = newValue } } }
- 在UIHostingController中注入初始值
class MyHostingController: UIHostingController<ContentView> { override init(rootView: ContentView) { super.init(rootView: rootView.environment(\.displayGamut, traitCollection.displayGamut)) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
- 监听UIKit侧trait变化,同步更新SwiftUI环境
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) guard traitCollection.displayGamut != previousTraitCollection?.displayGamut else { return } rootView = rootView.environment(\.displayGamut, traitCollection.displayGamut) }
- 在SwiftUI视图中直接使用
struct ContentView: View { @Environment(\.displayGamut) private var displayGamut var body: some View { Text("当前色域: \(displayGamut.rawValue)") } }
内容的提问来源于stack exchange,提问作者Logan Shire
相关产品推荐
相关产品推荐

