Как изменить размер шрифта NSTextField при использовании в SwiftUI

Ниже представлено демонстрационное приложение с простым в приложении для Mac. По какой-то причине размер шрифта не изменится, что бы я ни пытался.

      import Cocoa
import SwiftUI

@main
struct SwiftUIWindowTestApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
    }
  }
}

struct ContentView: View {
  @State private var text = "Text goes here..."
  var body: some View {
    FancyTextField(text: $text)
      .padding(50)
  }
}

struct FancyTextField: NSViewRepresentable {
  @Binding var text: String
  func makeNSView(context: Context) -> NSTextField {
    let textField = NSTextField()
    textField.font = NSFont.systemFont(ofSize: 30) //<- Not working
    return textField
  }
  func updateNSView(_ nsView: NSTextField, context: Context) {
    nsView.stringValue = text
  }
}

Это все приложение. Я не делаю ничего другого в этом простом примере. Я могу изменить цвет текста и другие атрибуты, но размер шрифта почему-то не меняется.

По прихоти я попытался изменить его и на стороне SwiftUI, но я не ожидал, что это сработает (и это не так):

      FancyTextField(text: $text)
  .font(.system(size: 20))

Любые идеи?

1 ответ

Это особенно странно:

      struct FancyTextField: NSViewRepresentable {
  @Binding var text: String
  func makeNSView(context: Context) -> NSTextField {
    let textField = MyNSTextField()
    textField.customSetFont(font: .systemFont(ofSize: 50))
    return textField
  }
  func updateNSView(_ nsView: NSTextField, context: Context) {
    nsView.stringValue = text
  }
}

class MyNSTextField : NSTextField {
    func customSetFont(font: NSFont?) {
        super.font = font
    }
    
    override var font: NSFont? {
        get {
            return super.font
        }
        set {}
    }
}

Может быть, кто-то придумает более чистое решение, но вы правы - нормальные методы просто установить в NSTextField, похоже, здесь не работает. Кажется, это связано с тем, что внешние элементы (отладчик не дает мне хорошего намека) пытаются установить шрифт на системный размер шрифта 13.

Итак, мое решение - подкласс и сделать сеттер для не отвечает. Затем я определяю пользовательский метод установки, поэтому единственный способ добраться до настоящего установщика — через мой пользовательский метод.

Немного хакерский, но он работает.

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