SwiftUI中如何阻止Sheet弹出时AccentColor变为灰色?
SwiftUI Sheet弹出时保持AccentColor不变灰的解决方法
问题原因
SwiftUI的Color.accentColor会响应视图的激活状态:当Sheet弹出后,后方的父视图进入非激活状态,系统会自动给accentColor叠加灰度滤镜,导致颜色变灰。而Color("AccentColor")是直接读取资源目录里的原始静态颜色,不受视图激活状态影响。
解决方法
直接替换为资源颜色
将代码中所有Color.accentColor替换为Color("AccentColor"),直接使用资源里的原始颜色,彻底避开系统的动态调整逻辑。自定义全局颜色扩展
为了避免重复写字符串,可创建一个Color扩展统一管理:extension Color { static let customAccent = Color("AccentColor") }之后在代码中直接使用
Color.customAccent即可。覆盖环境的accentColor
在父视图中通过环境变量,将系统的accentColor替换为自定义资源颜色,这样子视图中使用Color.accentColor时会读取这个静态值,不会随状态变灰:struct ContentView: View { @State private var showSheet = false var body: some View { Button("弹出Sheet") { showSheet = true } .accentColor(Color("AccentColor")) .sheet(isPresented: $showSheet) { Text("Sheet内容") } } }
内容的提问来源于stack exchange,提问作者Mycah
相关产品推荐
相关产品推荐

