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

ntjbwcob  于 2022-11-26  发布在  iOS
关注(0)|答案(6)|浏览(109)

到目前为止,我能够为视图编写自定义修饰符;然而,当我试图保持代码干燥时,我试图为文本字段添加一个自定义修饰符。视图修饰符可以很好地处理类似于以下的内容:

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#>>

我不知道怎么用。
有什么建议吗?

jc3wubiy

jc3wubiy1#

现在可以在ViewModifier中添加.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())
    }
}

用量Text("Hello").customText()

busg9geu

busg9geu2#

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())
xdnvmnnf

xdnvmnnf3#

您可以创建自定义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())
icomxhvb

icomxhvb4#

Xcode 11 beta 4中,color(_:)修饰符已被弃用。因此请改用foregroundColor(_:)方法。

cld4siwp

cld4siwp5#

据我所知,使用Text扩展名要好得多。对于Text,一些修饰符非常特殊,返回的主体类型不是View,而是Text.You can find many here

extension Text {
    func font(size: CGFloat) -> Text { // don't return `some View`
        self.font(Font.custom("Open Sans"), size: size)
    }
}

这意味着我们为ViewModifier定义了Content和Body的类型,不确定是否有更好的方法。

roqulrg3

roqulrg36#

使用自定义字体

  • 安装字体在您的mac和显示字体的详细信息在字体书,使用postscript名称所有的时间

  • 将字体添加到应用程序

在新文件中添加enum
导入SwiftUI

enum CustomFonts: String {
        case bold = "Family-Bold", medium = "Family-Medium"
}

在新文件中添加扩展名:

import SwiftUI

extension Font {
    static func custom(_ font: CustomFonts, size: CGFloat) -> SwiftUI.Font {
        SwiftUI.Font.custom(font.rawValue, size: size)
    }
}

用途:

Text("Hello World")
  .font(.custom(.bold, size: 24))

相关问题