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

105voto

Baig Punkte 4197

Am einfachsten geht es mit Storyboard:

Etikett einbetten in eine StackView und setzen Sie die folgenden zwei Attribute von StackView im Attributinspektor:

1- Axis a Horizontal ,

2- Alignment a Top

enter image description here

2 Stimmen

Für bessere Ergebnisse können Sie dies tun StackView > View > UILabel, weil, wenn Sie nur ein UILabel innerhalb eines StackView einbetten, die StackView Größe anpassen, um UILabel auf minimale Größe passen

0 Stimmen

Tolle Idee, die UILabel in einige UIView Unterklasse (einfach UIView reicht in der Regel aus) und lassen Sie das Etikett in Richtung unten wachsen. Danke!

1 Stimmen

Mit dem Menübefehl Editor->Einbetten bei ausgewähltem Etikett werden die Beschränkungen für das Etikett von Xcode aufgehoben, Sie können dann einfach die Beschränkungen für die StackView festlegen. Dieser Ansatz ist am nächsten zu einem "SwiftUI" Layout-Ansatz, der ist, wie ich es entdeckt.

83voto

BadPirate Punkte 25244

Wie die Antwort oben, aber es war nicht ganz richtig, oder einfach zu klatschen in Code, so dass ich es ein bisschen bereinigt. Fügen Sie diese Erweiterung entweder in eine eigene .h- und .m-Datei ein oder fügen Sie sie einfach direkt über der Implementierung ein, die Sie verwenden möchten:

#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

@implementation UILabel (VerticalAlign)
- (void)alignTop
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.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"];
    }
}

- (void)alignBottom
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.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 = [NSString stringWithFormat:@" \n%@",self.text];
    }
}
@end

Um sie zu verwenden, fügen Sie Ihren Text in das Etikett ein und rufen dann die entsprechende Methode auf, um ihn auszurichten:

[myLabel alignTop];

o

[myLabel alignBottom];

0 Stimmen

SizeWithFont veraltet

72voto

Purple Ninja Girl Punkte 1087

Eine noch schnellere (und schmutzigere) Möglichkeit, dies zu erreichen, besteht darin, den Zeilenumbruchmodus des UILabels auf "Clip" zu setzen und eine feste Anzahl von Zeilenumbrüchen hinzuzufügen.

myLabel.lineBreakMode = UILineBreakModeClip;
myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];

Diese Lösung wird nicht für jeden funktionieren -- insbesondere, wenn Sie immer noch "..." am Ende Ihrer Zeichenkette anzeigen wollen, wenn sie die Anzahl der angezeigten Zeilen überschreitet, müssen Sie eines der längeren Code-Bits verwenden -- aber für viele Fälle wird dies Ihnen geben, was Sie brauchen.

3 Stimmen

Die Einstellung des Zeilenumbruchmodus auf 'Clip' scheint die automatische Größenanpassung des Etiketts zu stören. Verwenden Sie UILineBreakModeWordWrap stattdessen.

0 Stimmen

Und besser Leerzeichen hinzufügen " \n \n "

64voto

ivanzoid Punkte 5832

Anstelle von UILabel können Sie UITextField mit der Option der vertikalen Ausrichtung:

textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.userInteractionEnabled = NO; // Don't allow interaction

7 Stimmen

Achtung: UITextField erlaubt nur eine einzige Textzeile.

3 Stimmen

Um den Kommentar von @DavidJames zu ergänzen: UITextView wäre besser geeignet

55voto

David Greco Punkte 631

Ich habe lange mit diesem Problem gekämpft und wollte meine Lösung mitteilen.

Damit erhalten Sie eine UILabel die den Text automatisch auf 0,5 Skalen verkleinert und ihn vertikal zentriert. Diese Optionen sind auch in Storyboard/IB verfügbar.

[labelObject setMinimumScaleFactor:0.5];
[labelObject setBaselineAdjustment:UIBaselineAdjustmentAlignCenters];

0 Stimmen

Es funktionierte perfekt unter allen angebotenen Antworten. Danke @David Greco. Wenn wir zusätzlich zu diesen Eigenschaften adjustsFontSizeToFitWidth auf YES setzen, passt der Text in den Rahmen, ohne dass der Rahmen des Etiketts verändert wird.

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