39 Stimmen

Wie ändert man den Zeilenabstand eines UILabel/UIFont?

Ich habe bereits viel gesucht und konnte keine Antwort finden.

Ich habe ein normales UILabel, das folgendermaßen definiert ist:

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

Und ich wollte den horizontalen Abstand zwischen den Buchstaben enger machen, während die Schriftgröße beibehalten wird.

Gibt es eine Möglichkeit, das zu tun? Es sollte eine ziemlich einfache Sache sein.

Prost Leute, Andre

UPDATE:

Also musste ich es so machen:

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

Aber ich muss das rechts ausrichten. Ich könnte das manuell tun, wenn ich die Breite des gezeichneten Textes kennen würde, aber es ist fast unmöglich, das zu finden.

Ich habe von ATSU gelesen, aber ich konnte keine Beispiele finden.

Das ist doof :/

0 Stimmen

Möglicher Doppelgänger von stackoverflow.com/questions/1063268/…

0 Stimmen

Ist es also nicht möglich, es ohne die Verwendung von benutzerdefinierten Schriftarten oder ohne die Verwendung von Quartz 2D zu tun?

1 Stimmen

Sie können die Größe des Bereichs, den der Text in einem UILabel einnehmen wird, erhalten, indem Sie die Methode - (CGSize)sizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode der NSString-Kategorie UIStringDrawing aufrufen. Dann können Sie diese Größe um den Betrag verringern, um den Sie Ihren Text verkleinert haben, denke ich. Wenn Sie es immer noch benötigen :)

43voto

Krizai Punkte 611

Von iOS 6 an können Sie NSAttributedString in UILabel verwenden.

In der angezeigten Zeichenfolge können Sie das Attribut NSKernAttributeName verwenden, um den Buchstabensatz festzulegen.

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 Stimmen

Danke für die Zeitersparnis :) (y)

11voto

user363349 Punkte 1158

Ich habe UILabel erweitert, um den Zeichenabstand zu ändern. Dies sollte direkt funktionieren und Schriftart, Text, Farbe usw. aus dem UILabel selbst ziehen (ordentlicher Code!).

Sie werden vielleicht bemerken, dass ich den Text zweimal zeichne, zuerst mit transparenter Farbe. Dies dient dazu, den Text im Label automatisch zu zentrieren. Auch wenn dies ineffizient sein mag - ist es nicht schön, automatisch zentriert zu sein?

Viel Spaß!

@interface RALabel : UILabel {
}
@end  

@implementation RALabel 

- (void) drawRect:(CGRect)rect 
{

    // Zeichen-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);

    // Zeichne 1, aber unsichtbar, um die Länge des Strings zu erhalten.
    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);

    // Breite berechnen und zweite Zeichnung.
    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]);

}

2 Stimmen

Du kannst mit dieser Lösung nur ASCII-Zeichen verwenden

7voto

Andre Punkte 4357

Ich habe eine Lösung für den Buchstabenabstand und die Ausrichtung nach rechts gefunden.

Hier ist sie:

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

Der Buchstabenabstand ist das "10" in der letzten Zeile. Die Ausrichtung erfolgt über den lastPos.

Hoffentlich hilft das jemandem da draußen.

3 Stimmen

Deine Methode ist plausibel (und die erste, die mir eingefallen ist), aber leider könnte sie nicht gut funktionieren, wenn du viele Textbereiche rendern musst. Ich denke, das Update von Andre ist in den meisten Fällen viel besser.

3voto

CodeOverRide Punkte 4333

Auf Swift:

let myTitle = "mein Titel"
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()

0voto

Zack Punkte 1181

Nicht in einer öffentlich verfügbaren Version von iPhone OS. ;-) Wenn Sie ein aktueller iPhone-Entwickler sind, können Sie anhand der "Was ist neu" -Hinweise für iPhone OS 3.2 eine Vorstellung davon bekommen, wohin iPhone OS geht.

Update: iOS v3.2, das die Unterstützung für Kerning hinzufügte, war noch unter NDA, als ich das gepostet habe. Für eine aktuellere Antwort, siehe Wie man Kerning in iPhone UILabel einstellt.

0 Stimmen

Sie können die Dimension des im UILabel gezeichneten Textes mit textRectForBounds:limitedToNumberOfLines: bestimmen. Klingt so, als hätten Sie gefunden, wonach Sie gesucht haben! Ich hatte nur angenommen, dass Sie nach Kerning gesucht haben. Viel Spaß beim Codieren!

0 Stimmen

Zum aktuellen Zeitpunkt ist die aktuelle iOS-Version 6.1. Der Weg, dies (einfach) zu erreichen, ist die Verwendung von NSAttributedString, aber es war in den meisten Steuerelementen bis iOS 6.0 nicht verfügbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X