Swift 在一个UILabel中显示分数

Swift 在一个UILabel中显示分数,swift,uilabel,fractions,Swift,Uilabel,Fractions,我试图将一个分数显示为1/2,但我希望线条是水平的,这样分数看起来更像分数,像这样: 1 _ 2 然而,没有巨大的空间,我可以在一个UILabel(可以有多行)中使用它。我还需要能够将分数作为分数的分子/分母,以此类推。有什么建议吗?(字体、字符…) 谢谢,, Gleb Koval这里有一个UIView子类,它绘制了一个分数: class FractionView: UIView { var font: UIFont = UIFont.systemFont(ofSize: 16) {

我试图将一个分数显示为1/2,但我希望线条是水平的,这样分数看起来更像分数,像这样:

1
_
2
然而,没有巨大的空间,我可以在一个UILabel(可以有多行)中使用它。我还需要能够将分数作为分数的分子/分母,以此类推。有什么建议吗?(字体、字符…)

谢谢,,
Gleb Koval

这里有一个
UIView
子类,它绘制了一个分数:

class FractionView: UIView {
    var font: UIFont = UIFont.systemFont(ofSize: 16) {
        didSet { self.setNeedsDisplay() }
    }
    var numerator: Int = 1 {
        didSet { self.setNeedsDisplay() }
    }
    var denominator: Int = 2{
        didSet { self.setNeedsDisplay() }
    }
    var spacing: CGFloat = 5{
        didSet { self.setNeedsDisplay() }
    }

    override func draw(_ rect: CGRect) {
        let numString = "\(numerator)" as NSString
        let numWidth = numString.size(withAttributes: [.font: font]).width
        let denomString = "\(denominator)" as NSString
        let denomWidth = denomString.size(withAttributes: [.font: font]).width
        let numX: CGFloat
        let denomX: CGFloat

        if numWidth <= denomWidth {
            denomX = 0
            numX = (denomWidth - numWidth) / 2
        } else {
            denomX = (numWidth - denomWidth) / 2
            numX = 0
        }

        numString.draw(at: CGPoint(x: numX, y: 0), withAttributes: [.font : font])
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: font.lineHeight + spacing))
        path.addLine(to: CGPoint(x: self.frame.maxX, y: font.lineHeight + spacing))
        UIColor.black.setStroke()
        path.lineWidth = 1
        path.stroke()
        denomString.draw(at: CGPoint(x: denomX, y: font.lineHeight + spacing * 2), withAttributes: [.font: font])
    }
}

// usage:
let width = ("12" as NSString).size(withAttributes: [.font: UIFont.systemFont(ofSize: 16)]).width
let view = FractionView(frame: CGRect(x: 0, y: 0, width: width, height: 48))
view.backgroundColor = .white
view.denominator = 12

将其设置为两行
“1\n2”
并在第一行下划线。@Sulthan如何在其中一个字符上划线而不在另一个字符上划线?使用
NSAttributedString
@Sulthan ThanksThanks,但@Sulthan已经在我可以轻松处理的评论中做出了回答。我没有给出答案,因为我担心这个数字看起来不太好强调可能需要一些空间来增加尺寸。此外,标签必须居中。我个人只会使用两个标签,两个标签之间有一个简单的视图,有一个给定的背景。@Glebkova顺便说一下,对于Sulthan处理不同位数的分数的方法,您需要添加空格。@glebkova我更新了答案,使其适用于分数,如
1/12
@Sweeper我通过执行str=nsmutableAttributeString(string:“12\n23”)和所有下划线代码使其生效。在字符串中,空格是使用Alt+Space创建的不可见字符(在Mac/iPad上)
let attrString = NSMutableAttributedString(string: "1", attributes: [NSAttributedStringKey.underlineStyle : 1])
attrString.append(NSAttributedString(string: "\n2"))
attrString
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
label.attributedText = attrString
label.numberOfLines = 2