一、何谓前景色
在SwiftUI体系内,一个View可能包含一个或多个图层,那么最前面的一个图层就是ForegroundColor或ForegroundStyle作用的目标图层。当然这个图层可能不会响应前景色的要求:
如上图所示,Rectangle作为shape图层,能响应前景色要求,导致图层变成前景色。Button的作用图层是Text,也能响应前景色要求。Image的话,要看具体情况,对于例子中的SF symbol能改变其最前面图层的颜色;如果是普通图片,则设置前景色无效;如果Image图层之上通过overlay加了Text,那么Text成为最上面的图层,它能响应前景色要求。
二、ForegroundColor 和 ForegroundStyle
顾名思义,ForegroundColor只能设置颜色,而ForegroundStyle能设置样式,何谓样式?
SwiftUI中把Color、Gradient、Material、Hierarchical和Semantic五类视觉效果称谓样式。从这个角度看,ForegroundColor相当于ForegroundStyle使用Color的版本,说明ForegroundStyle更为强大。其中Gradient是渐变,Material是磨玻璃效果,两者比较好理解。Hierarchical和Semantic稍微麻烦一些。
Hierarchical意思是层次的,意味着给父View设置ForegroundStyle,会将ForegroundStyle传递给子View。.primary等同于传递过来的ForegroundStyle,而.secondary和其他几个会在前者基础上变得更浅。
Semantic是语义的意思,SwiftUI中把text, shapes, and template images (including symbols)作为前景元素,那么.foreground就是获取当前context中它们的颜色。同理.background和.selection分别获取背景和选中的颜色,而tint则是强调色。所谓的context,它不同于Hierarchical以父View作为参考,它是以整个APP的状态作为参照物,会考虑当前是处于深色还是浅色模式。例如Text 的ForegroundStyle设置为.foreground,则浅色模式时是黑色,深色模式时是白色,而background恰好相反。
三、参考
Dynamic Colors in SwiftUI using ShapeStyle in iOS 17 - Kyle Lanchman
标签:ForegroundColor,Hierarchical,前景色,VS,SwiftUI,ForegroundStyle,图层 From: https://blog.csdn.net/Mamong/article/details/142580035