swift 在一个UILabel中显示分数

uemypmqf  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(149)

我试图将分数显示为1/2,但我想将线显示为水平,这样分数看起来更像分数,类似于这样的东西:

1
_
2

然而,由于没有大量的空间,我可以在一个UILabel(可以有多行)中使用它。我还需要能够把一个分数作为一个分数的分子/分母等等。有什么建议吗?(字体、字符...)
谢谢你,格列布·科瓦尔

unhi4e5o

unhi4e5o1#

下面是一个绘制分数的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

正如Sulthan在评论中建议的那样,使用NSAttributedString将是一种更简单的方法:

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

7xllpg7q

7xllpg7q2#

另一个选择是使用Swift FractionFormatter。我写它是为了使用Unicode分数字形创建分数,所以它们看起来像“½”,而不是让数字完全在彼此的顶部。由于它们是从标准字体字形创建的,因此可以在任何使用文本的地方使用它们。

let fractionFormatter = FractionFormatter()
fractionFormatter.string(from: 1.5) // "1 ½"

相关问题