xcode 如何使用SwiftUI显示分数

rjzwgtxy  于 2023-01-27  发布在  Swift
关注(0)|答案(2)|浏览(193)

我尝试在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)
    }
}
ie3xauqp

ie3xauqp1#

UIFontCTFont是免费桥接的,这意味着您可以通过说出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()
)

产生以下结果:

u5i3ibmn

u5i3ibmn2#

在此基础上,这里有一个没有弃用的版本,它接受UIFont.TextStyle作为参数,允许您简单地执行以下操作:

Text("1/4")
    .font(.fraction(.headline))

以下是您需要的扩展:

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

extension Font {
    static func fraction(_ style: UIFont.TextStyle) -> Font {
        let preferredFont = UIFont.preferredFont(forTextStyle: style)
        let size = preferredFont.pointSize
        return Font(UIFont.fractionFont(ofSize: size) as CTFont)
    }
}

相关问题