2016-11-08 1 views
1

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

Каждая метка имеет поплавок в нем, как это:

enter image description here

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

enter image description here

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

Эти цифры используют этот формат:

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

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

EDIT: Поплавки выровнены по левому краю на этикетках. Хорошо, я могу уменьшить ширину меток и выровнять их вправо, но мне интересно, есть ли другое решение в коде, потому что уменьшение ширины меток вызовет другие проблемы на интерфейсе, обманув все это.

+0

Да, я знаю. Я добавил это к вопросу, в то же время вы печатали его ...Мне интересно, есть ли решение в коде, потому что это сделает весь интерфейс. – SpaceDog

+0

жаль об этом! – SpaceDog

+0

Используйте NSTextAlignmentRight. –

ответ

3

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

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

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

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

Вы можете попытаться установить UILabel вправо, например. Что-то вроде:

label.textAlignment = NSTextAlignmentRight; 

Или для одной цифры до точки случае вы можете предварять РИС ПРОСТРАНСТВО Unicode, U + 2007, это пространство с одной и той же ширины, как и цифры в шрифтах с равной ширины цифр и так все числа будут иметь одинаковую ширину.

1

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

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

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

+0

Я думаю, что это сделает трюк! БЛАГОДАРЯ! – SpaceDog

Смежные вопросы