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

47voto

Erstellen Sie eine neue Klasse

LabelTopAlign

.h-Datei

#import <UIKit/UIKit.h>

@interface KwLabelTopAlign : UILabel {

}

@end

.m-Datei

#import "KwLabelTopAlign.h"

@implementation KwLabelTopAlign

- (void)drawTextInRect:(CGRect)rect {
    int lineHeight = [@"IglL" sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, 9999.0f)].height;
    if(rect.size.height >= lineHeight) {
        int textHeight = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, rect.size.height)].height;
        int yMax = textHeight;
        if (self.numberOfLines > 0) {
            yMax = MIN(lineHeight*self.numberOfLines, yMax);    
        }

        [super drawTextInRect:CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, yMax)];
    }
}

@end

bearbeiten

Hier ist eine einfachere Implementierung, die das Gleiche tut:

#import "KwLabelTopAlign.h"

@implementation KwLabelTopAlign

- (void)drawTextInRect:(CGRect)rect
{
    CGFloat height = [self.text sizeWithFont:self.font
                            constrainedToSize:rect.size
                                lineBreakMode:self.lineBreakMode].height;
    if (self.numberOfLines != 0) {
        height = MIN(height, self.font.lineHeight * self.numberOfLines);
    }
    rect.size.height = MIN(rect.size.height, height);
    [super drawTextInRect:rect];
}

@end

0 Stimmen

+1 für die richtige Antwort. Anders als die sizeToFit Lösungen macht dies die UILabel setzen. jede Text am Anfang, auch wenn Sie einen kürzeren Text dynamisch durch einen längeren ersetzen oder umgekehrt.

42voto

bearMountain Punkte 3940

enter image description here

Im Interface Builder

  • Satz UILabel auf die Größe des größtmöglichen Textes
  • Satz Lines auf '0' im Attribut-Inspektor

In Ihrem Code

  • Legen Sie den Text des Etiketts fest
  • Rufen Sie an. sizeToFit auf Ihrem Etikett

Code-Schnipsel:

self.myLabel.text = @"Short Title";
[self.myLabel sizeToFit];

0 Stimmen

Funktionierte großartig, außer in meinem Fall musste ich Zeilen auf 2 festlegen - haben ein UILabel innerhalb einer UITableViewCell und Einstellung auf 0 machte es überlappen, aber Einstellung auf 2 arbeitete (Zelle hat genug Platz für 2 Zeilen)

42voto

ma11hew28 Punkte 112879

Verwenden Sie textRect(forBounds:limitedToNumberOfLines:) .

class TopAlignedLabel: UILabel {
  override func drawText(in rect: CGRect) {
    let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
    super.drawText(in: textRect)
  }
}

2 Stimmen

Sie, mein Herr, sind ein Gott!

5 Stimmen

Diese Antwort sollte Weg mehr Bewertungen, da es bei weitem die schönste und sauberste Lösung ist!

1 Stimmen

Das ist schön. Es hat mich auf den richtigen Weg gebracht, mein Etikett vertikal zu zentrieren.

38voto

Für Adaptive UI (iOS8 oder später) muss die vertikale Ausrichtung von UILabel vom StoryBoard aus eingestellt werden, indem die Eigenschaften geändert werden noOfLines =0" und

Zwänge

  1. Anpassen der UILabel-Beschränkungen LefMargin, RightMargin und Top Margin.

  2. Ändern Sie Content Compression Resistance Priority For Vertical =1000`, so dass Vertikal>Horizontal .

Constraints of UILabel

Bearbeitet:

noOfLines=0

und die folgenden Einschränkungen reichen aus, um die gewünschten Ergebnisse zu erzielen.

enter image description here

0 Stimmen

Das war großartig. Kannst du erklären, warum Vertikal>Horizontal funktioniert hat? Danke!

37voto

Jack Tiong Punkte 899

In meiner Anwendung habe ich die Linieneigenschaft des UILabels auf 0 gesetzt sowie eine untere Einschränkung des UILabels erstellt und sichergestellt, dass sie auf >= 0 gesetzt wird, wie in der Abbildung unten gezeigt. enter image description here

0 Stimmen

Ich habe keine Ahnung, warum dies nicht die akzeptierte Antwort ist. Sie ist so viel einfacher als die jetzige. Gute Antwort!

0 Stimmen

Ja! Das ist es, wonach ich gesucht habe. Dies sollte die akzeptierte Antwort sein.

0 Stimmen

Die bei weitem bessere Antwort. Ich danke Ihnen! +1

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