38 votes

Comment changer l'espacement des lettres UILabel / UIFont?

J'ai cherché des charges déjà et je ne pouvais pas trouver une réponse.

J'ai un normal UILabel, définie de cette manière:

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

Et je voulais l'espacement horizontal entre les lettres, pour être plus serré, alors que maintenir la taille de la police.

Est-il un moyen de faire cela? Il devrait être assez simple à faire.

Cheers les gars, Andre

Mise à JOUR:

J'ai donc été forcé de le faire comme ceci:

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

Mais j'ai besoin d'aligner à droite. Je pourrais le faire manuellement si je savais que la largeur de la tiré du texte, mais il s'avère presque impossible de trouver que.

J'ai lu sur ATSU, mais je ne pouvais pas trouver des exemples.

Ce n'est pas bon :/

43voto

Krizai Points 183

Depuis iOS 6, vous pouvez utiliser NSAttributedString dans UILabel.

Dans la chaîne attribuée, vous pouvez utiliser l'attribut NSKernAttributeName pour définir l'espacement des lettres.

 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;
 

11voto

user363349 Points 762

J'ai étendu UILabel pour changer l'espacement des caractères. Cela devrait résoudre le problème et extraire la police, le texte, la couleur, etc. de UILabel lui-même (codage approprié!).

Vous remarquerez peut-être que je dessine le texte deux fois, d'abord avec une couleur claire. C'est pour centrer automatiquement le texte dans l'étiquette. Bien que cela puisse être inefficace - n'est-il pas agréable d'être auto-centré?

Prendre plaisir!

 @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]);

}
 

8voto

Andre Points 1779

J'ai mis au point une solution pour l'espacement des lettres et l'alignement à droite.

La voici:

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

L'espacement des lettres est le "10" sur la dernière ligne. L'alignement vient du lastPos.

J'espère que cela aide quiconque.

0voto

Zack Points 806

Pas dans aucune version disponible publiquement d'iPhone OS. ;-) Si vous êtes actuellement développeur iPhone, vous pouvez avoir une idée de la direction que prend iPhone OS en consultant les notes "Nouveautés" pour iPhone OS 3.2.

Mise à jour: iOS v3.2, qui ajoutait la prise en charge du crénage, était toujours sous NDA lorsque j'ai publié cette publication. Pour une réponse à jour, voir Comment définir le crénage dans iPhone UILabel .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X