web-dev-qa-db-fra.com

Comment changer l'espacement des lettres d'un UILabel / UIFont?

J'ai déjà cherché des charges et je n'ai pas trouvé de réponse.

J'ai un UILabel normal, défini de cette façon:

    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 que l'espacement horizontal entre les lettres soit plus serré, tout en conservant la taille de la police.

Y a-t-il un moyen de faire cela? Ce devrait être une chose assez simple à faire.

Bravo les gars, Andre

MISE À JOUR:

J'ai donc été obligé 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 je dois aligner cela à droite. Je pourrais le faire manuellement si je connaissais la largeur du texte dessiné, mais il s'avère presque impossible de le trouver.

J'ai lu sur ATSU, mais je n'ai trouvé aucun exemple.

Cela craint: /

38
Andre

J'ai trouvé une solution pour l'espacement des lettres et l'alignement à droite.

Ça y est:

    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 provient des lastPos.

J'espère que cela aide n'importe qui là-bas.

8
Andre

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;
42
Krizai

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

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

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

}
11
user363349

Dans 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()
3
CodeOverRide

Pas dans une version publique d'iPhone OS. ;-) Si vous êtes un développeur iPhone actuel, vous pouvez vous faire une idée de la direction de l'iPhone OS en consultant les notes "Quoi de neuf" pour iPhone OS 3.2.

Mise à jour: iOS v3.2, qui a ajouté la prise en charge du crénage, était toujours sous NDA lorsque j'ai posté cela. Pour une réponse de mise à jour, voir Comment définir le crénage dans l'iPhone UILabel .

0
Zack