Есть ли способ установить отслеживание шрифта (т.е. интервал) внутри пользовательского SwiftUI ButtonStyle?

В SwiftUI вы можете установить отслеживание шрифта (расстояние между буквами) с помощью модификатора View:

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

Если у вас есть и применить свой пользовательский ButtonStyle вы можете делать всевозможные модификации стиля кнопки, но так как configuration.label не является экземпляром Text скорее ButtonStyleConfiguration.Label, у меня нет прямого доступа для подачи заявки tracking. Есть ли способ сделать это, не устанавливая его на Buttonх label 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 для изменения как шрифта, так и отслеживания выглядит ~ связанно, но нет соответствующего ответа.

1 ответ

Да, ButtonStyleConfiguration.Labelне соответствует , но это ваш стиль, вы можете игнорировать стандартную метку, и запросить свой интерфейсный контракт, который вам нужен ( 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

Другие вопросы по тегам