通过点

时间:2016-11-08 22:57:28

标签: ios objective-c cgfloat

我在垂直UILabels内有一堆UIStackView。堆栈使所有标签具有相同的宽度和高度。

每个标签都有一个浮动,如下所示:

enter image description here

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

enter image description here

我的一个问题是这些花车有不同的标签。

这些数字使用此格式:

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

即使有可能,我也不知道。所以,我没有代码可以显示。有可能吗?怎么样?

编辑:浮标在标签上左对齐。好吧,我可以减少标签宽度并将它们对齐到右边,但是我想知道代码中是否还有其他解决方案,因为减少标签的宽度会导致界面上出现其他问题,从而破坏了整个过程。

3 个答案:

答案 0 :(得分:4)

如果您的编辑说明,您不想设置标签' textAlignment向右(这当然是最简单的解决方案),这是另一种解决方案。你需要做两件事:

  1. 您需要使用带有等宽数字的字体。在iOS 9及更高版本中,默认情况下系统字体使用等宽数字,但是有一些编程方法可以获得使用等宽数字的系统字体变体。您可以使用+[UIFont monospacedDigitSystemFontOfSize:weight:],或者如果您已经拥有UIFont对象,则可以通过向其字体描述符添加属性来获取等宽数字变量(如果有)。有关执行此操作的代码,请参阅this answer(在Swift中)。不幸的是,在没有代码的故事板或xib中无法做到这一点。

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

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

答案 1 :(得分:1)

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

label.textAlignment = NSTextAlignmentRight;

或者对于点数大小之前的单个数字,您可以添加Unicode数字空间,U + 2007,这是一个宽度与宽度相等的字体中的数字相同的空格,因此所有数字都是相同的宽度

答案 2 :(得分:1)

如果你确实需要在不降低UILabel宽度的情况下从代码中执行此操作,则可以继承UILabel并覆盖此方法:

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

当然你也应该使用正确的对齐方式。