有没有办法在自定义 SwiftUI ButtonStyle 中设置字体跟踪(即间距)?

Is there a way to set font tracking (i.e. spacing) inside a custom SwiftUI ButtonStyle?

在 SwiftUI 中,您可以使用 tracking 视图修饰符在 Text View 上设置字体跟踪(字母间距):

Text("Hello, World!")
  .tracking(10)

如果您有 Button 并应用您的自定义 ButtonStyle,您可以对按钮的样式进行各种修改,但由于 configuration.label 不是Text 而是 ButtonStyleConfiguration.Label,我无法直接申请 tracking。有没有一种方法可以做到这一点而不必直接在 Buttonlabel View 上进行设置?这似乎是你应该能够做的事情,因为它是与风格相关的事情,但我不知道如何完成它。

public struct MyStyle: ButtonStyle {
    public func makeBody(configuration: Configuration) -> some View {
        configuration.label
          // (if I tried to put `.tracking` here it wouldn't work because it isn't Text)
          .foregroundColor(Color.red)
          .clipShape(Capsule())
          // … etc.
    }
}

ViewModifier to change both font and tracking 看起来~相关但没有相关答案。

是的,ButtonStyleConfiguration.LabelText 不匹配,但这是您的风格,您可以忽略标准标签,并通过接口合同请求自己,正是您需要的 (Text在这种情况下),就像下面的演示

public struct MyStyle: ButtonStyle {
    let label: Text                   // << here !!

    public func makeBody(configuration: Configuration) -> some View {
        label               // << here !!
            .tracking(10)
            .foregroundColor(configuration.isPressed ? .black : .red)
            .clipShape(Capsule())
    }
}

并将其用作(或使用按钮构建器创建自己的按钮扩展以隐藏那些不需要的卷曲)

Button(action: {
        // action here
    }){}
    .buttonStyle(MyStyle(label: Text("Hello")))

测试 Xcode 13.2 / iOS 15.2