Выравнивание поплавков с двумя десятичными знаками по точке

У меня есть куча UILabels внутри вертикали UIStackView, Стопка делает все метки одинаковой ширины и высоты.

Каждый ярлык имеет плавающее число, например:

Но это некрасиво эстетично. Я хочу выровнять числа по точке. Как это:

Одна из моих проблем заключается в том, что эти поплавки находятся в разных ярлыках.

Эти числа используют это для форматирования:

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

Я понятия не имею, даже если это возможно. Итак, у меня нет кода, чтобы показать. Возможно ли это сделать? Как?

РЕДАКТИРОВАТЬ: поплавки на этикетках выровнены по левому краю. Хорошо, я могу уменьшить ширину меток и выровнять их по правому краю, но мне интересно, есть ли другое решение в коде, потому что уменьшение ширины меток вызовет другие проблемы в интерфейсе, разрушая все это.

3 ответа

Решение

Если, как говорится в вашей редакции, вы не хотите устанавливать ярлыки textAlignment направо (что, безусловно, самое простое решение), вот другое решение. Вам нужно сделать две вещи:

  1. Вам нужно использовать шрифт с разноцветными цифрами. В iOS 9 и более поздних версиях системный шрифт не использует моноширинные цифры по умолчанию, но существуют программные способы получить вариант системного шрифта, который использует моноширинные цифры. Ты можешь использовать +[UIFont monospacedDigitSystemFontOfSize:weight:] или, если у вас уже есть UIFont объект, вы можете получить вариант с одноразрядными цифрами (если он есть), добавив атрибут в свой дескриптор шрифта. Посмотрите этот ответ для кода, чтобы сделать это (в Swift). К сожалению, нет способа сделать это в раскадровке или XIB без кода.

  2. Вам нужно добавить достаточно U+2007 FIGURE SPACE к началу текста каждой метки, чтобы они все имели одинаковую длину. Например, если они все должны быть длиной пять символов:

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

Если вам действительно нужно сделать это из кода без уменьшения ширины UILabel, вы можете создать подкласс UILabel и переопределить этот метод:

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

Конечно, вы должны также использовать правильное выравнивание.

Вы можете попробовать установить UILabel выровнять по правому краю, например:

label.textAlignment = NSTextAlignmentRight;

Или для единственной цифры перед регистром символов можно добавить Unicode FIGURE SPACE, U+2007, это пробел с такой же шириной, что и цифра в шрифтах с одинаковой шириной, и поэтому все числа будут одинаковой ширины.

Другие вопросы по тегам