2010-03-30 3 views
36

Я уже искал грузы и не нашел ответа.Как изменить расстояние между буквами UILabel/UIFont?

У меня есть нормальный 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]; 

И я хотел горизонтальное расстояние между буквами, чтобы быть сильнее, в то время как mantaining размера шрифта.

Есть ли способ сделать это? Это должно быть довольно простой задачей.

Приветствия ребята, Андре

UPDATE:

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

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

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

Я читал об ATSU, но я не мог найти примеров.

Это отстой:/

+0

возможный дубликат http://stackoverflow.com/questions/1063268/is-it -доступный-к-alter-the-letter-spacing-kerning-of-a-font-with-cocoa-touch –

+0

, так что нет другого способа сделать это без использования пользовательских шрифтов или без использования Quartz 2D? – Andre

+1

Вы можете получить размер региона, который будет занимать текст в UILabel, который вызывается - (CGSize) sizeWithFont: (UIFont *) font minFontSize: (CGFloat) minFontSize actualFontSize: (CGFloat *) actualFontSize forWidth: (CGFloat) width lineBreakMode :(UILineBreakMode) метод lineBreakMode для NSString Категория UIStringDrawing. Тогда вы можете уменьшить этот размер на сколько вы сократили свой текст, я думаю. Если вам все еще нужно :) –

ответ

8

Я придумал решение для разметки букв и выравнивания вправо.

Вот он идет:

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.

Надеюсь, что это поможет кому угодно.

+3

. Ваш метод правдоподобен (и первое, что мне пришло в голову), но, к сожалению, это может не сработать, если вы необходимо сделать много областей текста. Я думаю, что обновление, предоставленное Андреем, намного лучше в общем случае –

0

Не в любой общедоступной версии iPhone OS. ;-) Если вы являетесь нынешним разработчиком iPhone, вы можете получить представление о том, где работает iPhone OS, просматривая примечания «Что нового» для iPhone OS 3.2.

Обновление: iOS v3.2, который добавил поддержку кернинга, все еще находился под NDA, когда я разместил это. Для ответа на обновление до даты см. How to set kerning in iPhone UILabel.

+0

Пожалуйста, проверьте мое обновление. Есть идеи? – Andre

+0

Вы можете определить размер текста, нарисованного в UILabel, с помощью textRectForBounds: limitedToNumberOfLines :. Похоже, вы нашли то, что искали! Я только что предположил, что вы ищете кернинг. Счастливое кодирование! – Zack

+0

На данный момент текущая версия iOS - 6.1. Способ выполнения этого (легко) заключается в использовании 'NSAttributedString', но он недоступен в большинстве элементов управления до тех пор, пока iOS 6.0 – DBD

11

Я расширил 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 = v.x - p.x; 
    float centeredX =(self.frame.size.width- width)/2; 
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]); 
    CGContextShowTextAtPoint(context, centeredX, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]); 

} 
+1

, вы можете использовать только символы ascii с этим решением – Bastian

40

Из iOS 6 вы можете использовать NSAttributedString в UILabel.

В приписываемой строке вы можете использовать атрибут 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; 
+1

thanx для сохранения моего времени :) (y) – ishhhh

3

В 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() 
Смежные вопросы