SwiftUI:如何为文本添加自定义修饰符

时间:2019-07-05 16:16:31

标签: ios swift swiftui

到目前为止,我已经能够为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)

    }
}

显然会失败,并显示以下错误: Error

如果我点击Fix建议,它将添加到我的代码中

TextFieldStyleModifier<<#Style: TextFieldStyle#>>

我不知道该怎么使用。

有什么建议吗?

4 个答案:

答案 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()) } }