【问题标题】:Display a fraction in one UILabel在一个 UILabel 中显示分数
【发布时间】:2018-03-24 13:24:09
【问题描述】:

我试图将分数显示为 1/2 之类的东西,但我想将其排成水平线,因此分数看起来更像分数,如下所示:

1
_
2

但是没有大量空间,并且我可以在一个 UILabel 中使用它(它可以有多行)。我还需要能够将分数作为分数的分子/分母等等。有什么建议? (字体、字符...)

谢谢你, 格列布·科瓦尔

【问题讨论】:

  • 两行 "1\n2" 并在第一行下划线。
  • @Sulthan 我怎样才能在其中一个字符下划线而不是另一个?
  • 使用NSAttributedString
  • @Sulthan 谢谢

标签: swift uilabel fractions


【解决方案1】:

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

正如 cmets 中的 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

【讨论】:

  • 谢谢,但@Sulthan 已经在 cmets 中给出了答案,我可以更轻松地使用它
  • 我没有发布答案,因为我担心这个数字只用下划线看起来不太好。可能需要一些空间来增加大小。标签也必须居中。我个人只会使用两个标签,它们之间有一个简单的视图,具有给定的背景。
  • @GlebKoval 顺便说一句,对于 Sulthan 处理具有不同位数的分数的方法,您需要添加空格。
  • @GlebKoval 我更新了答案,使其适用于像1/12 这样的分数。
  • @Sweeper 我通过执行 str = NSMutableAttributedString(string: “ 12 \n23”) 然后所有下划线代码让它工作。在字符串中,空格是使用 Alt + Space 创建的不可见字符(在 Mac/iPad 上)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2012-02-02
相关资源
最近更新 更多