2348 Stimmen

Text innerhalb eines UILabels vertikal nach oben ausrichten

Ich habe eine UILabel mit Platz für zwei Textzeilen. Manchmal, wenn der Text zu kurz ist, wird dieser Text in der vertikalen Mitte des Etiketts angezeigt.

Wie kann ich den Text vertikal so ausrichten, dass er sich immer am oberen Rand der UILabel ?

image representing a UILabel with vertically-centered text

0 Stimmen

35voto

Martin Wickman Punkte 19017

Erstellen Sie eine Unterklasse von UILabel. Funktioniert wie ein Zauber:

// TopLeftLabel.h

#import <Foundation/Foundation.h>

@interface TopLeftLabel : UILabel 
{
}

@end

// TopLeftLabel.m

#import "TopLeftLabel.h"

@implementation TopLeftLabel

- (id)initWithFrame:(CGRect)frame 
{
    return [super initWithFrame:frame];
}

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{
    CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];    
    textRect.origin.y = bounds.origin.y;
    return textRect;
}

-(void)drawTextInRect:(CGRect)requestedRect 
{
    CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:actualRect];
}

@end

Wie erörtert aquí .

29voto

firestoke Punkte 1033

Ich habe eine util-Funktion geschrieben, um diesen Zweck zu erreichen. Sie können einen Blick darauf werfen:

// adjust the height of a multi-line label to make it align vertical with top
+ (void) alignLabelWithTop:(UILabel \*)label {
  CGSize maxSize = CGSizeMake(label.frame.size.width, 999);
  label.adjustsFontSizeToFitWidth = NO;

  // get actual height
  CGSize actualSize = \[label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode\];
  CGRect rect = label.frame;
  rect.size.height = actualSize.height;
  label.frame = rect;
}

Wie wird es verwendet? (Wenn lblHello von Interface builder erstellt wird, überspringe ich einige Details der UILabel-Attribute)

lblHello.text = @"Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!";
lblHello.numberOfLines = 5;
\[Utils alignLabelWithTop:lblHello\];

Ich habe ihn auch in meinem Blog als Artikel veröffentlicht: http://fstoke.me/blog/?p=2819

27voto

Walty Yeung Punkte 3070

Ich habe eine Weile gebraucht, um den Code sowie den Code auf der eingeführten Seite zu lesen, und habe festgestellt, dass sie alle versuchen, die Rahmengröße der Beschriftung zu ändern, so dass die standardmäßige vertikale Ausrichtung in der Mitte nicht angezeigt würde.

In einigen Fällen möchten wir jedoch, dass die Beschriftung alle diese Bereiche einnimmt, auch wenn die Beschriftung so viel Text enthält (z. B. mehrere Zeilen mit gleicher Höhe).

Hier habe ich einen alternativen Weg verwendet, um es zu lösen, indem ich einfach Zeilenumbrüche am Ende des Labels einfüge (bitte beachten Sie, dass ich tatsächlich die UILabel aber das ist nicht notwendig):

CGSize fontSize = [self.text sizeWithFont:self.font];

finalHeight = fontSize.height * self.numberOfLines;
finalWidth = size.width;    //expected width of label

CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];

int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

for(int i = 0; i < newLinesToPad; i++)
{
    self.text = [self.text stringByAppendingString:@"\n "];
}

20voto

Andrew Romanov Punkte 4368

Sie können verwenden TTTAttributedLabel unterstützt sie die vertikale Ausrichtung.

@property (nonatomic) TTTAttributedLabel* label;
<...>

//view's or viewController's init method
_label.verticalAlignment = TTTAttributedLabelVerticalAlignmentTop;

20voto

Ich habe die Vorschläge hier aufgegriffen und eine Ansicht erstellt, die ein UILabel umhüllen kann und die Größe und die Anzahl der Zeilen so einstellt, dass es oben ausgerichtet ist. Setzen Sie einfach ein UILabel als Unteransicht:

@interface TopAlignedLabelContainer : UIView
{
}

@end

@implementation TopAlignedLabelContainer

- (void)layoutSubviews
{
    CGRect bounds = self.bounds;

    for (UILabel *label in [self subviews])
    {
        if ([label isKindOfClass:[UILabel class]])
        {
            CGSize fontSize = [label.text sizeWithFont:label.font];

            CGSize textSize = [label.text sizeWithFont:label.font
                                     constrainedToSize:bounds.size
                                         lineBreakMode:label.lineBreakMode];

            label.numberOfLines = textSize.height / fontSize.height;

            label.frame = CGRectMake(0, 0, textSize.width,
                 fontSize.height * label.numberOfLines);
        }
    }
}

@end

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