到目前为止,我已经能够为View编写自定义修饰符;但是,当尝试保持代码干燥时,我试图为TextFields添加自定义修饰符。视图修饰符可以很好地与类似这样的东西一起工作:
struct sampleModifier : ViewModifier {
var height: CGFloat? = 100
func body(content: Content) -> some View {
content
.frame(height: height)
.background(Color.white)
.border(Color.gray, width: 0.5)
.shadow(color: Color.black, radius: 15, x: 0, y: 10)
}
}
但是当我尝试使用font
之类的修饰符时,它会显示很多错误。我确实知道它们可能需要更加具体,而必须符合TextFieldStyleModifier
,但是我不知道如何使它起作用。我已经尝试过这种方式,但没有成功:
struct TitleModifier : TextFieldStyleModifier {
func body(content: TextFieldStyle) -> some View {
content
.font(.custom("Open Sans", size: 18))
.color(Color.green)
}
}
如果我点击Fix
建议,它将添加到我的代码中
TextFieldStyleModifier<<#Style: TextFieldStyle#>>
我不知道该怎么使用。
有什么建议吗?
答案 0 :(得分:1)
TextField也是视图,因此您以相同的方式创建修饰符:
struct TitleModifier : ViewModifier {
func body(content: Content) -> some View {
content
.font(.custom("Open Sans", size: 18))
.foregroundColor(Color.green)
}
}
还请注意,没有修饰符.color()。是.foregroundColor()。
要将其应用于FormField时,只需执行以下操作:
TextField("", text: $field1).modifier(TitleModifier())
答案 1 :(得分:0)
在 Xcode 11 beta 4 中,不推荐使用color(_:)
修饰符。因此,请改用foregroundColor(_:)
方法。
答案 2 :(得分:0)
您可以创建一个自定义TextFieldStyle,它仅适用于TextField,不适用于视图容器上的其他视图
struct CustomTextFieldStyle: TextFieldStyle {
func _body(configuration: TextField<Self._Label>) -> some View {
configuration
.font(.custom("Open Sans", size: 18))
.foregroundColor(Color.green)
}
}
用法:
Group {
Text("not applied here")
TextField("applied here", text: $presenter.name)
}
.textFieldStyle(CustomTextFieldStyle())
答案 3 :(得分:0)
现在,可以在ViewModifier内部的Scanner.useLocale
中添加.font()
和.foregroundColor()
修饰符。但是,如果您想添加一些只能应用于特定视图的自定义修饰符,例如content
用于“文本视图”的修饰符,则可以将这些修饰符添加到扩展名中。
.strikethrough()
用法struct TitleModifier: ViewModifier {
func body(content: Content) -> some View {
content
.font(.custom("Open Sans", size: 18))
.foregroundColor(.green)
}
}
extension Text {
func customText() -> some View {
self.strikethrough().bold().italic().lineLimit(4)
.modifier(TitleModifier())
}
}
。