如何在固定宽度上放置一块NSString?

时间:2011-07-01 13:45:12

标签: objective-c cocoa nsstring

我有NSString字符串,表示HH:MM:SS中的时间,但是HH和MM的数字可能会被省略。

我需要像这样对齐这些值的列:

1:01:43
  43:23
   7:00

最简单的方法是什么?

6 个答案:

答案 0 :(得分:13)

使用NSString类中提供的stringWithFormat方法。像这样:

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

%8s中的 8 是您在格式化字符串中需要的精确数字位数(或者在本例中为字符)。短于指定精度的输入字符串将左边填充空格,字符串长度将被截断。您可以阅读有关printf here的格式字符串的更多信息。

修改 感谢@Peter指出这一点。标准C中的格式说明符与目标C之间存在一些(次要)差异。请参阅有关格式字符串说明符here的Apples文档。

答案 1 :(得分:4)

填充代码不同但可能有帮助

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

ABC ......

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

AB

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

abc。 。

注意填充中的第一个字符是空格

答案 2 :(得分:2)

我认为没有一种简单的方法。您可以在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];
    }
}

答案 3 :(得分:1)

如果你指的是一个固定的宽度,NSTextField(Cocoa)和UILabel(Cocoa Touch)都允许你设置对齐。对于NSTextView和自定义绘图,您需要使用指定的对齐方式制作NSParagraphStyle(仅限AppKit)或CTParagraphStyle。

答案 4 :(得分:1)

如果您希望它与比例字体(即,不是等宽字体)明确对齐,那么您应该为字符串的每个组件使用不同的视图。

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

其中[things]中的每一个都是不同的UILabel

答案 5 :(得分:0)

此解决方案适用于iOS:

在iOS中,您可以使用UILabel并右对齐它们。当然,只有使用“固定字体”(例如Courier New)才能完美对齐。 如果必须使用比例字体,唯一的方法是使用NSString + UIKit扩展来在视图绘制上下文中的固定位置绘制字符串的所有字符: 理想情况下,流程是: 1.计算最长字符串的长度 2.通过添加额外的空间来填充所有其他字符串 3.然后为每个字符串迭代每个字符并将其绘制为特定位置(不要复制并粘贴此代码,只需使用它来创建一个想法;这是类似obj-c的伪代码)


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。