You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境,实现双向同步:

  1. 定义自定义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 }
    }
}
  1. 在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")
    }
}
  1. 监听UIKit侧trait变化,同步更新SwiftUI环境
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    guard traitCollection.displayGamut != previousTraitCollection?.displayGamut else { return }
    rootView = rootView.environment(\.displayGamut, traitCollection.displayGamut)
}
  1. 在SwiftUI视图中直接使用
struct ContentView: View {
    @Environment(\.displayGamut) private var displayGamut
    
    var body: some View {
        Text("当前色域: \(displayGamut.rawValue)")
    }
}

内容的提问来源于stack exchange,提问作者Logan Shire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:50:21