2011-07-01 9 views
5

Mam ciągi NSString, które reprezentują razy w GG: MM: SS, ale HH i cyfrę MM można pominąć.Jak zostawić podkładkę NSString, aby dopasować ją do stałej szerokości?

muszę wyrównać kolumny tych wartości, takich jak ten:

1:01:43 
    43:23 
    7:00 

Co jest najprostszym sposobem, aby to zrobić?

+1

nie próbowałem ciągi wypełniające przy użyciu klasy NSString, ale teoretycznie powinny być w stanie zrobić coś takiego ... NSString * inne = [NSString stringWithFormat: @ "% 8S", [str UTF8String]], gdzie * str * jest twoim nieprzetworzonym łańcuchem dat w formacie HH: MM: SS. – Perception

+0

Zgodnie z przykładem może wystarczyć wyrównanie do prawej strony ciągu znaków. Można to ustawić za pomocą stylu akapitu. – Gobra

+0

@Perception: Jeśli napiszesz to jako odpowiedź (z S zamienionym na s), przekażę to. Jest to poprawne rozwiązanie dla stałej szerokości znaków. –

Odpowiedz

13

Skorzystaj z metody stringWithFormat dostępnej w klasie NSString. Coś takiego:

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

w% 8s jest liczba precyzyjnych cyfr (lub w tym przypadku znaków), który ma w swojej sformatowany ciąg. Łańcuchy wejściowe krótsze niż określona precyzja zostaną dopełnione spacjami, łańcuchami dłuższymi niż zostaną obcięte. Więcej informacji o ciągach formatów dla printf here.

Edycja Dzięki @Peter za wskazanie tego. Istnieją pewne (niewielkie) różnice między specyfikatorami formatu w standardzie C, a w stosunku do Celu C. Zobacz dokumentację Jabłek na specyfikatorach ciągów formatów here.

+0

Lista specyficzna dla NSString/CFString znajduje się tutaj: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles /formatSpecifiers.html Istnieją co najmniej dwa różniące się pomiędzy 'printf' i NSString/CFString. –

+0

Dziękujemy za uratowanie nas od bardziej skomplikowanych, hacky odpowiedzi w prosty, wbudowany sposób! – jpswain

+0

Użyj: ... WithFormat: @ "% - 8s", [str UTF8String]]; w przypadku pól o odpowiednich odstępach – Raunak

0

To rozwiązanie jest ważna dla iOS:

w iOS można użyć UILabel i prawo je wyrównać. Oczywiście będziesz mieć idealne wyrównanie tylko wtedy, gdy użyjesz "stałej czcionki", na przykład Courier New. Jeśli musisz użyć czcionki proporcjonalnej, jedynym sposobem jest użycie rozszerzenia NIKtring + UIKit do narysowania wszystkich znaków ciągu w ustalonych pozycjach wewnątrz kontekstu widoku widoku: Idealnie przepływ: 1. obliczyć długość najdłuższy ciąg 2. Lewym-pad wszystkie pozostałe ciągi dodając dodatkową przestrzeń 3. następnie dla każdego ciągu iterować na każdej postaci i narysuj go jako określonej pozycji (nie kopiować i wklejać tego kodu, wystarczy użyć go, aby mieć pomysł, to jest obj-C jak pseudo-kod)


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; 
} 

oczywiście dx musi być wybrany w zależności od rozmiaru czcionki.

2

Nie sądzę, że istnieje łatwy sposób. Prawdopodobnie możesz napisać metodę kategorii na NSString, aby to zrobić.

- (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

Jeśli masz na myśli stałą punkt szerokości, zarówno NSTextField (Cocoa) i UILabel (Cocoa Touch) pozwalają ustawić wyrównanie. W przypadku NSTextView i niestandardowego rysunku konieczne będzie wykonanie NSParagraphStyle (tylko AppKit) lub CTParagraphStyle z określonym wyrównaniem.

1

Jeśli chcesz, aby miało to wyraźne wyrównanie z czcionką proporcjonalną (tj. Nie czcionką o stałej szerokości), powinieneś użyć różnych widoków dla każdego komponentu ciągu.

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

gdzie każdy z tych [things] jest inny UILabel

3

kod wyściółka inny, ale może być pomocne

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

ABC ......

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

AB

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

abc. . .

zauważyć, że pierwszy znak w padding jest przestrzenią

+0

pytanie dotyczy lewej klapki tej dokumentacji, jeśli dotyczy tylko prawego dopełnienia. –

Powiązane problemy