Как мне оставить накладку NSString, чтобы она соответствовала фиксированной ширине? - PullRequest
5 голосов
/ 01 июля 2011

У меня есть строки NSString, которые представляют времена в ЧЧ: ММ: СС, но ЧЧ и цифра ММ могут быть опущены.

Мне нужно выровнять столбцы этих значений следующим образом:

1:01:43
  43:23
   7:00

Какой самый простой способ сделать это?

Ответы [ 6 ]

13 голосов
/ 01 июля 2011

Используйте метод stringWithFormat, предоставленный в классе NSString .Примерно так:

NSString * dateStr = @"05:30";
NSString * formattedStr = [NSString stringWithFormat:@"%8s", [str UTF8String]];

8 в% 8s - это количество прецизионных цифр (или в данном случае символов), которое вы хотите в отформатированной строке.Входные строки короче указанной точности будут заполнены пробелами слева, строки длиннее, чем будут усечены.Вы можете узнать больше о форматных строках для printf здесь .

Редактировать Спасибо @Peter за указание на это.Есть некоторые (незначительные) различия между спецификаторами формата в стандарте C по сравнению с Objective C. Обратитесь к документации Apple по спецификаторам строки формата здесь .

4 голосов
/ 27 сентября 2014

код заполнения Другой, но может быть полезным

NSString *st = [@"abc" stringByPaddingToLength: 9 withString: @"." startingAtIndex:0];

а ......

[@"abc" stringByPaddingToLength: 2 withString: @"." startingAtIndex:0];

аЬ

[@"abc" stringByPaddingToLength: 9 withString: @". " startingAtIndex:1];

abc. , .

обратите внимание, что первым символом в отступе является пробел

2 голосов
/ 01 июля 2011

Я не думаю, что есть простой способ. Возможно, вы можете написать метод категории на NSString, чтобы сделать это.

- (NSString *)stringByPaddingLeftToLength:(NSUInteger)aLength withString:(NSString *)padString {
    NSInteger lengthToPad = aLength - [self length];

    if ( lengthToPad > 0 ) {
        NSString * padding = [@"" stringByPaddingToLength:lengthToPad withString:padString startingAtIndex:0];
        NSString * paddedString = [padding stringByAppendingString:self];

        return paddedString;
    } else {
        return [[self copy] autorelease];
    }
}
1 голос
/ 01 июля 2011

Если вы хотите, чтобы это имело явное выравнивание с пропорциональным шрифтом (т. Е. Не моноширинным шрифтом), то вы должны использовать различные представления для каждого из компонентов строки.

[hour]-[:]-[minute]-[:]-[second]
[hour]-[:]-[minute]-[:]-[second]
[hour]-[:]-[minute]-[:]-[second]

Где каждыйодин из них [things] другой UILabel

1 голос
/ 01 июля 2011

Если вы имеете в виду фиксированную точку ширину, то и NSTextField (Какао), и UILabel (Какао Touch) позволяют установить выравнивание. Для NSTextView и пользовательского чертежа вам необходимо создать NSParagraphStyle (только для AppKit) или CTParagraphStyle с указанным выравниванием.

0 голосов
/ 01 июля 2011

Это решение действительно для iOS:

в iOS вы можете использовать UILabel и выровнять их по правому краю. Конечно, у вас будет идеальное выравнивание, только если вы используете «фиксированный шрифт», как например Courier New. Если вы должны использовать пропорциональный шрифт, единственный способ - использовать расширение NSString + UIKit для рисования всех символов строки в фиксированных позициях внутри контекста рисования вида: Так что в идеале поток: 1. рассчитать длину самой длинной строки 2. добавьте слева все остальные строки, добавив дополнительное место 3. затем для каждой строки выполните итерацию по каждому символу и нарисуйте ее как определенную позицию (не копируйте и не вставляйте этот код, просто используйте его, чтобы иметь представление; это псевдокод, подобный obj-c-like)


CGFloat x=0; // the string start let's say at x=0
CGFloat dx=40; // distance between characters
for(NSInteger i=0;i<[myString length];i++) {
    NSString *char = [myString substringWithRange:NSRangeMake(i,1)];
    [char drawAtPoint:CGPointMake(x,y) withFont:myFont];
    x+=dx;
}

Конечно, dx должен быть выбран в соответствии с размером шрифта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...