如何使用 SwiftUI 显示分数

How can I show a fraction with SwiftUI

我试图在 SwiftUI 文本中表示分母大于 9 的分数。

我可以使用单独的元素并应用偏移来实现它,但是随着分数的动态变化,这会变得有点混乱。

有没有办法使用 attributedText 来做到这一点?

我遇到了带有不推荐使用的方法的 UIFont 扩展,想知道是否有任何类似的东西可以与 SwiftUI 一起使用:

extension UIFont {
    static func fractionFont(ofSize pointSize: CGFloat) -> UIFont {
        let systemFontDesc = UIFont.systemFont(ofSize: pointSize).fontDescriptor
        let fractionFontDesc = systemFontDesc.addingAttributes(
            [
                UIFontDescriptor.AttributeName.featureSettings: [
                    [
                        UIFontDescriptor.FeatureKey.featureIdentifier: kFractionsType,
                        UIFontDescriptor.FeatureKey.typeIdentifier: kDiagonalFractionsSelector,
                    ], ]
            ] )
        return UIFont(descriptor: fractionFontDesc, size:pointSize)
    }
}

UIFont 是 toll-free-bridged 和 CTFont,这意味着您可以通过说 as CTFontUIFont 转换为 CTFont。 SwiftUI 的 Font 有一个接受 CTFont.

的初始化器

因此,使用您发布的 fractionFont(ofSize:) 方法,这个 playground 代码:

PlaygroundPage.current.setLiveView(
    Text("The fraction 21/345 is rendered nicely.")
        .font(Font(UIFont.fractionFont(ofSize: UIFont.systemFontSize) as CTFont))
        .padding()
)

产生这个结果: