SwiftUI:环境修饰符

2020-04-01 21:26:11 浏览数 (1)

许多修饰符可以应用于容器,这允许我们同时将同一个修饰符应用于多个视图。

例如,如果我们在一个VStack中有四个文本视图,并且希望为它们提供相同的字体修饰符,我们可以直接将修饰符应用于VStack,并将该更改应用于所有四个文本视图:

代码语言:javascript复制
VStack {
    Text("Gryffindor")
    Text("Hufflepuff")
    Text("Ravenclaw")
    Text("Slytherin")
}
.font(.title)
这称为环境修饰符,与应用于视图的常规修饰符不同。

从编码的角度来看,这些修饰符的使用方式与常规修饰符完全相同。但是,它们的行为微妙地不同,因为如果这些子视图中的任何一个子视图重写同一个修饰符,则子视图的版本将优先。

例如,这显示了四个标题字体的文本视图,但其中一个有一个大标题:

代码语言:javascript复制
VStack {
    Text("Gryffindor")
        .font(.largeTitle)
    Text("Hufflepuff")
    Text("Ravenclaw")
    Text("Slytherin")
}
.font(.title)

在这里,font()是一个环境修饰符,这意味着Gryffindor文本视图可以用自定义字体覆盖它。

然鹅~,对VStack应用模糊效果,然后尝试禁用其中一个文本视图上的模糊:

代码语言:javascript复制
VStack {
    Text("Gryffindor")
        .blur(radius: 0)
    Text("Hufflepuff")
    Text("Ravenclaw")
    Text("Slytherin")
}
.blur(radius: 5)

这不会以相同的方式工作:blur()是一个常规的修饰符,因此应用于子视图的任何模糊都会添加到VStack模糊之上,而不是替换它。

据我所知,没有办法提前知道哪些修饰符是环境修饰符,哪些是常规修饰符——你只需要进行实验。尽管如此,我还是宁愿拥有它们:能够在任何地方应用一个修饰符,比将同一个东西复制粘贴到多个地方要好得多。

Previous: 条件修饰符

Hacking with iOS: SwiftUI Edition

Next: 将视图作为属性

0 人点赞