Выравнивание поплавков с двумя десятичными знаками по точке
У меня есть куча UILabels
внутри вертикали UIStackView
, Стопка делает все метки одинаковой ширины и высоты.
Каждый ярлык имеет плавающее число, например:
Но это некрасиво эстетично. Я хочу выровнять числа по точке. Как это:
Одна из моих проблем заключается в том, что эти поплавки находятся в разных ярлыках.
Эти числа используют это для форматирования:
[NSString stringWithFormat:@"%.2f", value];
Я понятия не имею, даже если это возможно. Итак, у меня нет кода, чтобы показать. Возможно ли это сделать? Как?
РЕДАКТИРОВАТЬ: поплавки на этикетках выровнены по левому краю. Хорошо, я могу уменьшить ширину меток и выровнять их по правому краю, но мне интересно, есть ли другое решение в коде, потому что уменьшение ширины меток вызовет другие проблемы в интерфейсе, разрушая все это.
3 ответа
Если, как говорится в вашей редакции, вы не хотите устанавливать ярлыки textAlignment
направо (что, безусловно, самое простое решение), вот другое решение. Вам нужно сделать две вещи:
Вам нужно использовать шрифт с разноцветными цифрами. В iOS 9 и более поздних версиях системный шрифт не использует моноширинные цифры по умолчанию, но существуют программные способы получить вариант системного шрифта, который использует моноширинные цифры. Ты можешь использовать
+[UIFont monospacedDigitSystemFontOfSize:weight:]
или, если у вас уже естьUIFont
объект, вы можете получить вариант с одноразрядными цифрами (если он есть), добавив атрибут в свой дескриптор шрифта. Посмотрите этот ответ для кода, чтобы сделать это (в Swift). К сожалению, нет способа сделать это в раскадровке или XIB без кода.Вам нужно добавить достаточно 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, это пробел с такой же шириной, что и цифра в шрифтах с одинаковой шириной, и поэтому все числа будут одинаковой ширины.