如何更改UILabel / UIFont的字母间距?

我已经search到负载,找不到答案。

我有一个正常的UILabel,这样定义:

UILabel *totalColors = [[[UILabel alloc] initWithFrame:CGRectMake(5, 7, 120, 69)] autorelease]; totalColors.text = [NSString stringWithFormat:@"%d", total]; totalColors.font = [UIFont fontWithName:@"Arial-BoldMT" size:60]; totalColors.textColor = [UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1.0]; totalColors.backgroundColor = [UIColor clearColor]; [self addSubview:totalColors]; 

而且我希望字母之间的水平间距更紧,同时保持字体的大小。

有没有办法做到这一点? 这应该是一个非常基本的事情。

干杯,安德烈

更新:

所以我被迫这样做:

 - (void) drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSelectFont (context, "Arial-BoldMT", 60, kCGEncodingMacRoman); CGContextSetCharacterSpacing (context, -10); CGContextSetTextDrawingMode (context, kCGTextFill); CGContextSetRGBFillColor(context, 221/255.0, 221/255.0, 221/255.0, 221/255.0); CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); CGContextSetTextMatrix(context, xform); char* result = malloc(17); sprintf(result, "%d", totalNumber); CGContextShowTextAtPoint (context, 0, 54, result, strlen(result)); } 

但我需要把这个alignment。 如果我知道绘制的文本的宽度,我可以手动地做到这一点,但几乎不可能find。

我已经阅读了ATSU,但是我找不到任何例子。

这很糟糕:

在iOS 6中,您可以在UILabel中使用NSAttributedString。

在属性string中,您可以使用属性NSKernAttributeName来设置字母间距

 NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString: @"Test test test test "]; [attrStr addAttribute:NSKernAttributeName value:@(4.0) range:NSMakeRange(0, attrStr.length)]; UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 300, 300, 100)]; label.attributedText = attrStr; 

我已经扩展了UILabel来改变字符间距。 这应该解决方框,并从UILabel本身(适当的编码!)拉字体,文本,颜色等。

你可能会注意到我画了两次,第一次用清晰的颜色。 这是将标签中的文本自动居中。 虽然这可能是低效的 – 是不是很好自动中心?

请享用!

 @interface RALabel : UILabel { } @end @implementation RALabel - (void) drawRect:(CGRect)rect { // Drawing code CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman); CGContextSetCharacterSpacing(context, 1); CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]); CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f ); CGContextSetTextMatrix (context, myTextTransform); // draw 1 but invisbly to get the string length. CGPoint p =CGContextGetTextPosition(context); float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2; CGContextShowTextAtPoint(context, 0, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]); CGPoint v =CGContextGetTextPosition(context); // calculate width and draw second one. float width = vx - px; float centeredX =(self.frame.size.width- width)/2; CGContextSetFillColorWithColor(context, [self.textColor CGColor]); CGContextShowTextAtPoint(context, centeredX, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]); } 

我已经想出了一个字母间距和右侧alignment的解决scheme。

这里是:

  NSString *number = [NSString stringWithFormat:@"%d", total]; int lastPos = 85; NSUInteger i; for (i = number.length; i > 0; i--) { NSRange range = {i-1,1}; NSString *n = [number substringWithRange:range]; UILabel *digit = [[[UILabel alloc] initWithFrame:CGRectMake(5, 10, 35, 50)] autorelease]; digit.text = n; digit.font = [UIFont fontWithName:@"Arial-BoldMT" size:60]; digit.textColor = [UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1.0]; digit.backgroundColor = [UIColor clearColor]; [self addSubview:digit]; CGSize textSize = [[digit text] sizeWithFont:[digit font]]; CGFloat textWidth = textSize.width; CGRect rect = digit.frame; rect.origin.x = lastPos - textWidth; digit.frame = rect; lastPos = rect.origin.x + 10; } 

字母间距是最后一行的“10”。 队列来自lastPos。

希望这可以帮助那里的任何人。

在Swift中:

 let myTitle = "my title" let titleLabel = UILabel() let attributes: NSDictionary = [ NSFontAttributeName:UIFont(name: "HelveticaNeue-Light", size: 20), NSForegroundColorAttributeName:UIColor.whiteColor(), NSKernAttributeName:CGFloat(2.0) ] let attributedTitle = NSAttributedString(string: myTitle, attributes: attributes as? [String : AnyObject]) titleLabel.attributedText = attributedTitle titleLabel.sizeToFit() 

不在任何公开版本的iPhone OS中。 ;-)如果您是目前的iPhone开发人员,您可以通过查看iPhone OS 3.2的“新增function”笔记来了解iPhone OS的用途。

更新: iOS v3.2,增加了对字距的支持,当我发布时,仍然在NDA之下。 有关更新至今的答案,请参阅如何在iPhone UILabel中设置字距调整 。