按点将浮点数与两位小数对齐

Aligning floats with two decimals by the point

我有一堆UILabels里面有一个竖UIStackView。堆栈正在使所有标签具有相同的宽度和高度。

每个标签都有一个浮点数,像这样:

但这在美学上是丑陋的。我想按点对齐数字。像这样:

我的一个问题是这些浮标位于不同的标签中。

这些数字用这个来格式化:

[NSString stringWithFormat:@"%.2f", value];

我不知道是否可能。所以,我没有要显示的代码。有可能这样做吗?怎么样?

编辑:浮动在标签上左对齐。好的,我可以减少标签的宽度并将它们右对齐,但我想知道是否有代码中的其他解决方案,因为减少标签的宽度会导致界面上出现其他问题,使整个事情变得糟糕。

您可以尝试将 UILabel 设置为右对齐,例如类似于:

label.textAlignment = NSTextAlignmentRight;

或者对于点大小写之前的单个数字,您可以在前面加上 Unicode FIGURE SPACE、U+2007,这是一个 space,其宽度与等宽字体中的数字相同数字,因此所有数字的宽度都相同。

如果您确实需要在不减小 UILabel 宽度的情况下从代码中做到这一点,您可以子类化 UILabel 并覆盖此方法:

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 0, 0, rightOffset};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

当然你也应该使用右对齐。

如果正如您的编辑所说,您不想将标签的 textAlignment 设置为正确的(这当然是最简单的解决方案),这里有另一个解决方案。你需要做两件事:

  1. 您需要使用等宽数字的字体。在 iOS 9 及更高版本中,系统字体默认 使用等宽数字,但有编程方法可以获取使用等宽数字的系统字体变体。您可以使用 +[UIFont monospacedDigitSystemFontOfSize:weight:], or if you already have a UIFont object, you can get a monospaced-digits variant (if there is one) by adding an attribute to its font descriptor. See 作为代码来执行此操作(在 Swift 中)。不幸的是,没有代码就无法在故事板或 xib 中执行此操作。

  2. 您需要在每个标签文本的开头添加足够的 U+2007 FIGURE SPACE 以使它们的长度相同。例如,如果它们的长度都应为五个字符:

    NSString *text = [NSString stringWithFormat:"%.2f", value];
    while (text.length < 5) {
        text = [@"\u2007" stringByAppendingString:text];
    }
    label.text = text;