[SwiftUI 知识碎片] Debris-13 环境 Modifier

424 阅读2分钟
译自 Environment modifiers
更多内容欢迎关注公众号 「Swift花园」

许多 modifier 不仅可以应用在各种视图上,也能应在容器上。

举个例子,如果我们在一个 VStack 里有四个文本视图,并且希望给他们设置相同的字号 modifier , 我们可以把 modifier 直接应用在 VStack 上,而不用分别应用在四个文本视图上。

VStack {
    Text("Gryffindor")
    Text("Hufflepuff")
    Text("Ravenclaw")
    Text("Slytherin")
}
.font(.title)

这种 modifier 称为环境 modifier,它有别于常规的应用于视图的 modifier 。

从编码的视角,这些 modifier 的用法和常规 modifier 一模一样。但是,如果某个子视图覆盖了相同的 modifier ,他们的表现比较精妙 —— 子视图的版本优先级更高。

举个例子,下面的代码中三个文本视图用标题字号,而有一个用了大标题字号。

VStack {
    Text("Gryffindor")
        .font(.largeTitle)
    Text("Hufflepuff")
    Text("Ravenclaw")
    Text("Slytherin")
}
.font(.title)

因此,font() 是一个环境 modifier ,意味着 Gryffindor 文本视图可以用自定义的字号覆盖它。

但是,像下面这样的代码,先给一个 VStack应用模糊效果,然后再试图在子视图上禁用模糊的做法会失败:

VStack {
    Text("Gryffindor")
        .blur(radius: 0)
    Text("Hufflepuff")
    Text("Ravenclaw")
    Text("Slytherin")
}
.blur(radius: 5)

之所以行不通,因为blur() 在这里是一个常规 modifier ,所以子视图上再应用的 blur 是追加而不是替换。

据我所知,并没有方法可以提前知道哪些 modifier 是环境 modifier ,哪些 modifier 是常规 modifier —— 你只能做实验。尽管如此,我还是希望有环境 modifier 的存在,因为一个 modifier 就可以把效果应用给所有子视图,实在是比要复制粘贴几个地方要方便多了。


我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~