如何使用 Swift 获取 MacOS 上的字体样式?

问题描述 投票:0回答:1

我正在尝试制作一个菜单,其中填充了特定字体的字体样式。在下面的代码中,我有一项尝试已被注释掉。下面的代码正确打印样式,但我无法让 ForEach() 工作。 GetFontStyles() 接缝返回一个数组数组,该内部数组包含多个字段,包括字体名称、字体样式和一些 ID 号。注意用于拉取样式的成员[1]。

struct AddFontStyleItems: View {
    var dm: DrawModel
    init(_ dm: DrawModel ) { self.dm = dm }
    
    var body: some View {
    var fontStyles = getFontStyles(for: dm.curFont )
//      ForEach(fontStyles, id: \.self) { curStyle in
//          Button( "xxx" ) {
//              print( "Style: \(curStyle)")
//      //      print("Type of Member: \(type(of: member)) - \(member[1])")
//          }
//      }
        Button( "xxx" ) {
            let fontStyles = NSFontManager.shared.availableMembers(ofFontFamily: dm.curFont)
            print("-\nFont: \(dm.curFont)")
            
            if let members = fontStyles {
                for member in members {
                    print("Style for: \(dm.curFont) - \(member[1])")
                }
            }
        }
    }
}

func getFontStyles(for fontFamily: String) -> [String] {
     let fontManager = NSFontManager.shared

     guard let availableMembers = fontManager.availableMembers(ofFontFamily: fontFamily) else {
          return []
     }

     return availableMembers.compactMap { member in
         return member as? String
     }
}
swift menu
1个回答
0
投票

您可以使用助手来尝试这种方法

struct FontModel
保存字体结果并使其更容易在
ForEach
循环中使用。

struct ContentView: View {
    var body: some View {
        AddFontStyleItems(DrawModel(curFont: "Helvetica"))
    }
}

// for testing
struct DrawModel {
    var curFont: String
}

struct FontModel: Identifiable {  // <--- here
    let id = UUID()
    var fontType: String
    var fontName: String
    var fontWeight: Int
    var fontTrait: Int
    
    init(_ arr: [Any]) {
        if arr.count < 5 {
            self.fontType = arr[0] as! String
            self.fontName = arr[1] as! String
            self.fontWeight = arr[2] as! Int
            self.fontTrait = arr[3] as! Int
        } else {
            self.fontType = ""
            self.fontName = ""
            self.fontWeight = 0
            self.fontTrait = 0
        }
    }
}

struct AddFontStyleItems: View {
    var dm: DrawModel
    @State private var fontStyles: [FontModel] = [] // <--- here
    
    init(_ dm: DrawModel) { self.dm = dm }
    
    var body: some View {
        ForEach(fontStyles) { curStyle in  // <--- here
            Button(curStyle.fontName) {
                print("---> Style: \(curStyle)")
            }
        }
        .onAppear {
            fontStyles = getFontStyles(for: dm.curFont) // <--- here
        }
    }
    
    func getFontStyles(for fontFamily: String) -> [FontModel] {
        var results: [FontModel] = []
        if let members = NSFontManager.shared.availableMembers(ofFontFamily: dm.curFont) {
            for member in members {
                results.append(FontModel(member))
            }
        }
        return results
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.