我试图将分数显示为1/2,但我想将线显示为水平,这样分数看起来更像分数,类似于这样的东西:
1 _ 2
然而,由于没有大量的空间,我可以在一个UILabel(可以有多行)中使用它。我还需要能够把一个分数作为一个分数的分子/分母等等。有什么建议吗?(字体、字符...)谢谢你,格列布·科瓦尔
unhi4e5o1#
下面是一个绘制分数的UIView子类:
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将是一种更简单的方法:
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
7xllpg7q2#
另一个选择是使用Swift FractionFormatter。我写它是为了使用Unicode分数字形创建分数,所以它们看起来像“½”,而不是让数字完全在彼此的顶部。由于它们是从标准字体字形创建的,因此可以在任何使用文本的地方使用它们。
let fractionFormatter = FractionFormatter() fractionFormatter.string(from: 1.5) // "1 ½"
2条答案
按热度按时间unhi4e5o1#
下面是一个绘制分数的
UIView
子类:正如Sulthan在评论中建议的那样,使用
NSAttributedString
将是一种更简单的方法:7xllpg7q2#
另一个选择是使用Swift FractionFormatter。我写它是为了使用Unicode分数字形创建分数,所以它们看起来像“½”,而不是让数字完全在彼此的顶部。由于它们是从标准字体字形创建的,因此可以在任何使用文本的地方使用它们。