将相同的样式修饰符应用于条件 if/else 语句的任一分支
Applying identical styling modifiers to either branch of a conditional if/else statement
我有一个简单的视图,它要么是一个字符串,要么是带有上标的相同字符串,类似于下面的内容确实有效:
struct MyView : View {
let both: Bool
var body: some View {
if both {
Text("a") + Text("b").baselineOffset(6)
} else {
Text("a")
}
}
}
当我尝试对结果应用一些复杂的样式时,我 运行 遇到了麻烦,例如 .bold().font(.largeTitle).background(.yellow)...
。无论采用哪个分支,我都想应用样式,但我能想到的最好的方法要求我为条件的每个分支重复它:
struct MyView : View {
let both: Bool
var body: some View {
if both {
(Text("a") + Text("b").baselineOffset(6)).bold().font(.largeTitle)....
} else {
(Text("a")).bold().font(.largeTitle)....
}
}
}
我想我有点理解为什么需要浏览结果生成器和视图生成器。构造此结构的规范方法是什么,以便我只有一个修饰符实例,而不必重新键入并在两个或多个位置保持同步?
您可以使用辅助变量(可计算或函数)来准备组合文本(`因为您想应用 text-specific 修饰符)并将所有文本修饰符应用于结果,例如
struct MyView : View {
let both: Bool
var body: some View {
myText.bold().font(.largeTitle)
}
var myText: Text {
if both {
return Text("a") + Text("b").baselineOffset(6)
} else {
return Text("a")
}
}
}
在要更改的视图周围使用 Group { }
。它是一种“不可见”的视图,将修饰符应用于其中的所有内容。
编辑:它不适用于 .baselineOffset()
,不过(感谢@Asperi)。
试试这个:
Group {
if someState {
Text("Hello")
} else {
Text("World")
}
}
.font(.largeTitle)
.foregroundColor(.red)
.padding()
.font()
、.foregroundColor()
和 .padding()
将应用于任一文本。
我有一个简单的视图,它要么是一个字符串,要么是带有上标的相同字符串,类似于下面的内容确实有效:
struct MyView : View {
let both: Bool
var body: some View {
if both {
Text("a") + Text("b").baselineOffset(6)
} else {
Text("a")
}
}
}
当我尝试对结果应用一些复杂的样式时,我 运行 遇到了麻烦,例如 .bold().font(.largeTitle).background(.yellow)...
。无论采用哪个分支,我都想应用样式,但我能想到的最好的方法要求我为条件的每个分支重复它:
struct MyView : View {
let both: Bool
var body: some View {
if both {
(Text("a") + Text("b").baselineOffset(6)).bold().font(.largeTitle)....
} else {
(Text("a")).bold().font(.largeTitle)....
}
}
}
我想我有点理解为什么需要浏览结果生成器和视图生成器。构造此结构的规范方法是什么,以便我只有一个修饰符实例,而不必重新键入并在两个或多个位置保持同步?
您可以使用辅助变量(可计算或函数)来准备组合文本(`因为您想应用 text-specific 修饰符)并将所有文本修饰符应用于结果,例如
struct MyView : View {
let both: Bool
var body: some View {
myText.bold().font(.largeTitle)
}
var myText: Text {
if both {
return Text("a") + Text("b").baselineOffset(6)
} else {
return Text("a")
}
}
}
在要更改的视图周围使用 Group { }
。它是一种“不可见”的视图,将修饰符应用于其中的所有内容。
编辑:它不适用于 .baselineOffset()
,不过(感谢@Asperi)。
试试这个:
Group {
if someState {
Text("Hello")
} else {
Text("World")
}
}
.font(.largeTitle)
.foregroundColor(.red)
.padding()
.font()
、.foregroundColor()
和 .padding()
将应用于任一文本。