SwiftUI:如何打开字体选择器?

4

我正在使用SwiftUI编写一个简单的状态栏应用程序,其中只有一个弹出窗口。

是否可以从弹出视图中的按钮启动字体选择器并捕获结果?

该应用程序在MacOS上运行。我使用的是XCode 11.7。


1
使用 let panel = NSFontPanel.sharedpanel.orderBack(nil),然后使用 NSFontManager 处理操作。 - davidev
HackingWithSwift 发布了一篇关于此的精彩教程。你尝试过使用 UIFontPickerViewController 吗?不过你需要一个 UIViewReprensentable - Christophe Prat
@davidev 感谢您的评论。我现在可以显示面板了,但您能否在此之后给我一些使用NSFontManager的指针呢? - Manngo
@ChristophePrat 这个网站非常棒,我从中学到了很多。然而,我认为那篇文章涉及到UIKit,它只适用于iOS。 - Manngo
1个回答

6

我曾经也有同样的问题,最终找到了这个repo,它提供了一个FontPicker组件。下面是相关的代码部分,展示了如何在SwiftUI中使用NSFontPanel。

class FontPickerDelegate {
    var parent: FontPicker

    init(_ parent: FontPicker) {
        self.parent = parent
    }
    
    @objc
    func changeFont(_ id: Any ){
        parent.fontSelected()
    }

}

public struct FontPicker: View {
    let labelString: String
    @Binding var font:NSFont
    
    @State var fontPickerDelegate:FontPickerDelegate? = nil
    
    public init(_ label: String, selection: Binding<NSFont>) {
        self.labelString = label
        self._font = selection
    }
    public var body: some View {
        HStack {
            Text(labelString)
            Button(action: {
                if NSFontPanel.shared.isVisible {
                    NSFontPanel.shared.orderOut(nil)
                    return
                }
                self.fontPickerDelegate = FontPickerDelegate(self)
                NSFontManager.shared.target = self.fontPickerDelegate
                NSFontPanel.shared.setPanelFont(self.font, isMultiple: false)
                NSFontPanel.shared.orderBack(nil)
            }, label: {
                Image(systemName: "textformat").resizable().scaledToFit()
            })
        }
    }
    
    func fontSelected() {
        self.font = NSFontPanel.shared.convert(self.font)
        //NSFontPanel.shared.orderOut(nil)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接