Come modificare la spaziatura delle lettere di UILabel / UIFont?

Ho già cercato i carichi e non ho trovato risposta.

Ho un UILabel normale, definito in questo modo:

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

E volevo che la spaziatura orizzontale tra le lettere fosse più stretta, pur mantenendo le dimensioni del carattere.

C’è un modo per fare questo? Dovrebbe essere una cosa piuttosto semplice da fare.

Ciao ragazzi, Andre

AGGIORNARE:

Quindi sono stato costretto a farlo in questo modo:

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

Ma ho bisogno di allineare questo a destra. Potrei farlo manualmente se conoscessi la larghezza del testo disegnato, ma è quasi imansible trovarlo.

Ho letto su ATSU, ma non ho trovato alcun esempio.

Questo fa schifo: /

Da iOS 6 è ansible utilizzare NSAttributedString in UILabel.

Nella stringa attribuita è ansible utilizzare l’attributo NSKernAttributeName per impostare la spaziatura delle lettere

 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; 

Ho esteso UILabel per modificare la spaziatura dei caratteri. Dovrebbe funzionare la scatola e estrarre font, testo, colore ecc. Dallo stesso UILabel (codifica corretta!).

Potresti notare che disegno il testo due volte, prima con il colore chiaro. Questo serve per centrare automaticamente il testo nell’etichetta. Mentre questo può essere inefficiente – non è bello essere centrato automaticamente?

Godere!

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

Ho trovato una soluzione per la spaziatura delle lettere e l’allineamento a destra.

Eccolo:

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

La spaziatura delle lettere è il “10” sull’ultima riga. L’allineamento viene dall’ultimoPos.

Spero che questo aiuti chiunque là fuori.

In 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() 

Non in nessuna versione pubblicamente disponibile di iPhone OS. 😉 Se sei un attuale sviluppatore di iPhone, puoi farti un’idea di dove sta andando il sistema operativo per iPhone esaminando le note “Novità” per iPhone OS 3.2.

Aggiornamento: iOS v3.2, che ha aggiunto il supporto per la crenatura, era ancora sotto NDA quando ho postato questo. Per una risposta aggiornata alla data, vedere Come impostare il kerning in iPhone UILabel .