2010-03-30 10 views
36

J'ai déjà cherché des charges et je n'ai pas trouvé de réponse.Comment changer l'espacement des lettres d'UILabel/UIFont?

J'ai une UILabel normale, définie ainsi:

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é, tandis que mantaining la taille de la police.

Existe-t-il un moyen de le faire? Ce devrait être une chose assez simple à faire.

Vive les gars, Andre

MISE À JOUR:

donc je suis 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 ce à droite. Je pourrais le faire manuellement si je connaissais la largeur du texte dessiné, mais il s'avère presque impossible de trouver cela. J'ai lu à propos d'ATSU, mais je n'ai trouvé aucun exemple.

Cette suce:/

+0

double possible de http://stackoverflow.com/questions/1063268/is-it -possible-de-modifier-le-espacement-crénage-de-une-police-avec-cacao-touch –

+0

donc il n'y a pas d'autre moyen de le faire sans utiliser les polices personnalisées ou sans utiliser Quartz 2D? – Andre

+1

Vous pouvez obtenir la taille de la région que le texte occupera dans un appel UILabel - (CGSize) sizeWithFont: (UIFont *) police minFontSize: (CGFloat) minFontSize actualFontSize: (CGFloat *) actualFontSize pourWidth: (CGFloat) width lineBreakMode :(UILineBreakMode) Méthode lineBreakMode de la classe NSString UIStringDrawing. Ensuite, vous pouvez réduire cette taille de combien vous avez réduit votre texte, je suppose. Si vous en avez encore besoin :) –

Répondre

8

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

Ici, il va:

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 du dernierPos.

Espérons que cela aide n'importe qui.

+3

Votre méthode est plausible (et la première qui me vient à l'esprit) mais malheureusement elle pourrait ne pas fonctionner si vous besoin de rendre plusieurs régions de texte. Je pense que la mise à jour fournie par André est beaucoup mieux dans le cas général –

0

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

Mise à jour: iOS v3.2, qui prenait en charge le crénage, était toujours sous NDA lorsque j'ai publié ce message. Pour obtenir une réponse mise à jour, voir How to set kerning in iPhone UILabel.

+0

S'il vous plaît vérifier ma mise à jour. Des idées? – Andre

+0

Vous pouvez déterminer la dimension du texte dessiné dans UILabel à l'aide de textRectForBounds: limitedToNumberOfLines :. On dirait que vous avez trouvé ce que vous cherchiez, cependant! Je venais de supposer que tu cherchais le crénage. Codage heureux! – Zack

+0

A partir de cette date, la version iOS actuelle est 6.1. Le moyen d'accomplir ceci (facilement) est d'utiliser 'NSAttributedString', mais il était indisponible dans la plupart des contrôles jusqu'à iOS 6.0 – DBD

11

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

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

Profitez-en!

@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

vous ne pouvez utiliser que des caractères ASCII avec cette solution – Bastian

40

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 lettre

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

merci d'économiser mon temps :) (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()