I am trying to represent a fraction with denominator larger than 9 in a SwiftUI Text.
I can implement this using individual elements and applying offsets but that get's a bit messy as the fractions change dynamically.
Is there a way to do this using attributedText?
I came across thi UIFont extension with deprecated methods and wondering if anything similar that can be used with 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)
}
}
CodePudding user response:
UIFont
is toll-free-bridged with CTFont
, which means you can cast a UIFont
to a CTFont
by saying as CTFont
. And SwiftUI's Font
has an initializer that takes a CTFont
.
So, using the fractionFont(ofSize:)
method you posted, this playground code:
PlaygroundPage.current.setLiveView(
Text("The fraction 21/345 is rendered nicely.")
.font(Font(UIFont.fractionFont(ofSize: UIFont.systemFontSize) as CTFont))
.padding()
)
produces this result: