如何使用字体修改器? SwiftUI 中的大写和字体大小

How to work with Font Modifiers? uppercased and font size in SwiftUI

我正在尝试使用修饰符为我的应用程序创建一些默认字体。如果有更简单的方法,我很想知道。目前,我有

struct PrimaryLabel: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(Font.body.smallCaps())
            .font(.system(size: 20, weight: .light, design: .serif)) // this is not working. Only the first one will '.font' will work

    }
}

可用性:

Text("Hello World").modifier(PrimaryLabel())

有没有办法更改字体类型(例如使用 AmericanTypewriter-Light 字体)、全部大写并使用 weight: .light, design: .serif、粗体等样式?我不想定义每一个文本。结构中的第二个 .font 修饰符不起作用。

extension View {
    func primaryLabelStyle(_ weight: Font.Weight) -> some View {
        return self.modifier(PrimaryLabel(weight: weight))
    }
}

struct PrimaryLabel: ViewModifier {
    let weight: Font.Weight
    func body(content: Content) -> some View {
        content
            .font(Font.body.smallCaps())
            .font(.system(size: 20, weight: weight, design: .serif)) // this is not working. Only the first one will '.font' will work

    }
}

Text("Hello World").primaryLabelStyle(.light)

第一个修改器只可见,这是合乎逻辑的,尝试应用少量,背景或.foregroundColor ....它的工作方式相同。

尝试

VStack {
    Text("ALFA").font(.largeTitle)
    Text("Beta").foregroundColor(Color.red)
}
.font(.system(size: 150))
.foregroundColor(Color.blue)

您可以使用不同的初始值设定项创建字体

init(CTFont)

从平台字体实例获取字体。

static func system(Font.TextStyle, design: Font.Design) -> Font

获取具有给定样式和设计的系统字体。

static func system(size: CGFloat, weight: Font.Weight, design: Font.Design) -> Font

指定要使用的系统字体,以及要应用于文本的样式、粗细和任何设计参数。

static func custom(String, size: CGFloat) -> Font

获取具有给定名称和大小的自定义字体。

您还可以进一步设置文本样式

设置文本视图的样式

func bold() -> Text

对文本应用粗体字重。

func italic() -> Text

对文本应用斜体。

func fontWeight(Font.Weight?) -> Text

设置文本的字体粗细。

func baselineOffset(CGFloat) -> Text

设置文本的基线偏移量。

func tracking(CGFloat) -> Text

设置文本的跟踪。

func kerning(CGFloat) -> Text

设置两个字符之间的间距或字距调整。

func underline(Bool, color: Color?) -> Text

对文本应用下划线。

func strikethrough(Bool, color: Color?) -> Text

对文本应用删除线。

警告!! 并非所有组合都受支持! 参见 How to apply .italic() to .largeTitle Font?