it-swarm.com.de

Richten Sie den Text in einem UILabel vertikal nach oben aus

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

Wie stelle ich den Text vertikal so aus, dass er immer oben in der UILabel steht?

image representing a UILabel with vertically-centered text

2057
Stefan

Es ist nicht möglich, die vertikale Ausrichtung einer UILabel festzulegen. Sie können jedoch den gleichen Effekt erzielen, wenn Sie den Rahmen des Labels ändern. Ich habe meine Etiketten orange gemacht, damit Sie klar sehen können, was passiert.

Hier ist der schnelle und einfache Weg, dies zu tun:

    [myLabel sizeToFit];

sizeToFit to squeeze a label


Wenn Sie ein Etikett mit längerem Text haben, das mehr als eine Zeile enthält, setzen Sie numberOfLines auf 0 (Null bedeutet hier eine unbegrenzte Anzahl von Zeilen).

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

Longer label text with sizeToFit


Längere Version

Ich mache mein Label im Code, damit Sie sehen können, was los ist. Sie können das meiste auch im Interface Builder einrichten. Mein Setup ist eine auf Ansichten basierende App mit einem Hintergrundbild, das ich in Photoshop erstellt habe, um Ränder (20 Punkte) anzuzeigen. Das Etikett hat eine attraktive orange Farbe, sodass Sie sehen können, was mit den Abmessungen passiert.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

Einige Einschränkungen bei der Verwendung von sizeToFit kommen bei zentriert oder rechtsbündigem Text zum Tragen. Folgendes passiert:

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

enter image description here

Das Etikett hat immer noch eine feste obere linke Ecke. Sie können die Breite des Originaletiketts in einer Variablen speichern und nach sizeToFit setzen oder eine feste Breite angeben, um diesen Problemen zu begegnen:

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.Origin.x, myFrame.Origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

label alignment


Beachten Sie, dass sizeToFit die minimale Breite Ihres ursprünglichen Labels berücksichtigt. Wenn Sie mit einem Etikett in der Breite 100 beginnen und sizeToFit darauf aufrufen, erhalten Sie ein (möglicherweise sehr großes) Etikett mit einer Breite von 100 (oder etwas weniger) zurück. Möglicherweise möchten Sie das Etikett vor der Größenänderung auf die gewünschte Mindestbreite einstellen.

Correct label alignment by resizing the frame width

Einige andere Dinge zu beachten:

Ob lineBreakMode respektiert wird, hängt von der Einstellung ab. NSLineBreakByTruncatingTail (Standardeinstellung) wird nach sizeToFit ignoriert, ebenso wie die beiden anderen Abschneidemodi (Kopf und Mitte). NSLineBreakByClipping wird ebenfalls ignoriert. NSLineBreakByCharWrapping arbeitet wie gewohnt. Die Rahmenbreite ist immer noch schmaler, um auf den ganz rechten Buchstaben zu passen.


Mark Amery hat ein Update für NIBs und Storyboards mit Auto Layout in den Kommentaren vorgenommen:

Wenn Ihr Label in einer Spitze oder einem Storyboard als Unteransicht der view eines ViewControllers enthalten ist, das Autolayout verwendet, funktioniert das Aufrufen Ihres sizeToFit-Aufrufs in viewDidLoad nicht, da die Größe und Position der Unteransichten nach viewDidLoad automatisch aufgerufen werden und sofort rückgängig gemacht werden die Auswirkungen Ihres sizeToFit-Aufrufs. Aufruf von sizeToFit aus viewDidLayoutSubviewswill work.


Meine ursprüngliche Antwort (für Nachwelt/Referenz):

Hierbei wird die NSString-Methode sizeWithFont:constrainedToSize:lineBreakMode: verwendet, um die für eine Zeichenfolge erforderliche Rahmenhöhe zu berechnen. Anschließend werden Ursprung und Breite festgelegt.

Ändern Sie die Größe des Rahmens für das Etikett anhand des einzufügenden Texts. Auf diese Weise können Sie beliebig viele Leitungen aufnehmen.

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;
2617
nevan king
  1. Stellen Sie den neuen Text ein:

    myLabel.text = @"Some Text"
    
  2. Setzen Sie den maximum number der Zeilen auf 0 (automatisch):

    myLabel.numberOfLines = 0
    
  3. Stellen Sie den Rahmen des Etiketts auf die maximale Größe ein:

    myLabel.frame = CGRectMake(20,20,200,800)
    
  4. Rufen Sie sizeToFit auf, um die Bildgröße so zu reduzieren, dass der Inhalt gerade passt:

    [myLabel sizeToFit]
    

Der Etikettenrahmen ist jetzt gerade hoch und breit genug, um ihn an Ihren Text anzupassen. Die obere linke sollte unverändert bleiben. Ich habe dies nur mit links oben ausgerichtetem Text getestet. Bei anderen Ausrichtungen müssen Sie den Rahmen möglicherweise nachträglich ändern.

Bei meinem Label ist außerdem das Aktivieren von Word aktiviert.

322
Jakob Egger

Beziehen Sie sich auf die Erweiterungslösung:

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

sollte durch ersetzt werden 

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

In jedem hinzugefügten Zeilenumbruch wird zusätzlicher Speicherplatz benötigt, da die nachlaufenden Wagenrückläufe des iPhone UILabels ignoriert werden :(

Ebenso sollte alignBottom mit @" \[email protected]%" anstelle von "\[email protected]%" aktualisiert werden (für die Initialisierung des Zyklus muss auch "for (int i = 0 ...") ersetzt werden.

Die folgende Erweiterung funktioniert für mich:

// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

// -- file: UILabel+VerticalAlign.m
@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

Rufen Sie dann nach jeder Textzuordnung von yourLabel [yourLabel alignTop]; oder [yourLabel alignBottom]; auf.

155

Für den Fall, dass es für jedermann hilfreich ist, hatte ich das gleiche Problem, konnte das Problem jedoch einfach lösen, indem ich von UILabel zu UITextView wechselte. Ich schätze das nicht für jedermann, weil die Funktionalität etwas anders ist.

Wenn Sie zu UITextView wechseln, können Sie alle Eigenschaften der Bildlaufansicht sowie die aktivierte Benutzerinteraktion deaktivieren. Dadurch wird erzwungen, dass er sich eher wie eine Beschriftung verhält.

 enter image description here

131
jowie

Kein Muss, kein Aufwand

@interface MFTopAlignedLabel : UILabel

@end


@implementation MFTopAlignedLabel

- (void)drawTextInRect:(CGRect) rect
{
    NSAttributedString *attributedText = [[NSAttributedString alloc]     initWithString:self.text attributes:@{NSFontAttributeName:self.font}];
    rect.size.height = [attributedText boundingRectWithSize:rect.size
                                            options:NSStringDrawingUsesLineFragmentOrigin
                                            context:nil].size.height;
    if (self.numberOfLines != 0) {
        rect.size.height = MIN(rect.size.height, self.numberOfLines * self.font.lineHeight);
    }
    [super drawTextInRect:rect];
}

@end

Kein Muss, kein Objective-c, keine Aufregung außer Swift 3:

class VerticalTopAlignLabel: UILabel {

    override func drawText(in rect:CGRect) {
        guard let labelText = text else {  return super.drawText(in: rect) }

        let attributedText = NSAttributedString(string: labelText, attributes: [NSFontAttributeName: font])
        var newRect = rect
        newRect.size.height = attributedText.boundingRect(with: rect.size, options: .usesLineFragmentOrigin, context: nil).size.height

        if numberOfLines != 0 {
            newRect.size.height = min(newRect.size.height, CGFloat(numberOfLines) * font.lineHeight)
        }

        super.drawText(in: newRect)
    }

}
89
jasongregori

Wie die Antwort oben, aber es war nicht ganz richtig oder es war einfach, in den Code einzuhängen, also habe ich den Code etwas aufgeräumt. Fügen Sie diese Erweiterung entweder der eigenen .h- und .m-Datei hinzu oder fügen Sie sie 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

Fügen Sie dann Ihren Text in das Etikett ein und rufen Sie die entsprechende Methode zum Ausrichten auf:

[myLabel alignTop];

oder

[myLabel alignBottom];
77
BadPirate

Eine noch schnellere (und schmutzigere) Möglichkeit besteht darin, den Zeilenumbruchmodus des UILabel 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 funktioniert nicht für alle Benutzer. Insbesondere, wenn Sie am Ende Ihrer Zeichenfolge noch "..." anzeigen möchten, wenn die Anzahl der angezeigten Zeilen überschritten wird, müssen Sie eine der folgenden Zeilen verwenden die längeren Bits - aber für viele Fälle bekommen Sie das, was Sie brauchen.

67

Anstelle von UILabel können Sie UITextField verwenden, die eine Option für die vertikale Ausrichtung aufweist:

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

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

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

[labelObject setMinimumScaleFactor:0.5];
[labelObject setBaselineAdjustment:UIBaselineAdjustmentAlignCenters];
48
David Greco

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 dasselbe 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
42

enter image description here

Im Interface Builder

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

In deinem Code

  • Legen Sie den Text der Beschriftung fest
  • Rufen Sie sizeToFit auf Ihrem Etikett auf

Code-Auszug:

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

Storyboard-Lösung: Die einfachste und einfachste Möglichkeit besteht darin, Label in StackView einzubetten und StackViews Axis auf Horizontal, Alignment auf Top in Attribute Inspector vom Storyboard zu setzen.

 enter image description here

36
Baig

Erstellen Sie eine Unterklasse von UILabel. Klappt wunderbar:

// 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 besprochen hier .

33
Martin Wickman

Für die adaptive Benutzeroberfläche (iOS8 oder später) muss die vertikale Ausrichtung von UILabel in StoryBoard durch Ändern der Eigenschaften. noOfLines = 0` und 

Einschränkungen

  1. Anpassen von UILabel LefMargin-, RightMargin- und Top-Margin-Einschränkungen.

  2. Content Compression Resistance Priority For Vertical = 1000` ändern, damit Vertical> Horizontal.

 Constraints of UILabel

Bearbeitet:

noOfLines=0

und die folgenden Bedingungen sind ausreichend, um die gewünschten Ergebnisse zu erzielen.

 enter image description here

32

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

 // Anpassen der Höhe einer mehrzeiligen Beschriftung, um sie vertikal nach oben auszurichten 
 + (void) alignLabelWithTop: (UILabel *) Beschriftung {
 CGSize maxSize = CGSizeMake (label.frame.size.width, 999); 
 label.adjustsFontSizeToFitWidth = NO; 

 // tatsächliche Höhe erhalten 
 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 benutzt man? (Wenn lblHello vom Interface-Builder erstellt wird, überspringe ich einige UILabel-Attributdetails.)

Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! "; 
 lblHello.numberOfLines = 5; 
 [Utils alignLabelWithTop : lblHello]; 

Ich habe es auch in meinem Blog als Artikel geschrieben: http://fstoke.me/blog/?p=2819

27
firestoke

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

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

Hier habe ich eine alternative Methode verwendet, um das Problem zu lösen, indem Sie die Zeilenumbrüche einfach am Ende des Labels anbringen (bitte beachten Sie, dass ich tatsächlich die Variable UILabel geerbt habe, dies ist jedoch nicht erforderlich):

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 "];
}
26
Walty Yeung

Ich habe die Vorschläge hier genommen und eine Ansicht erstellt, die ein UILabel umschließen kann, dessen Größe anpassen und die Anzahl der Zeilen so einstellen wird, dass sie oben ausgerichtet ist. Fügen Sie einfach ein UILabel als Unteransicht ein:

@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
19
user486646

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

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

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

In meiner App habe ich die line-Eigenschaft des UILabels auf 0 gesetzt und eine untere Einschränkung des UILabels erstellt und sichergestellt, dass es auf> = 0 gesetzt ist, wie in der folgenden Abbildung gezeigt. enter image description here

14
Jack Tiong

Ich habe festgestellt, dass die Antworten auf diese Frage jetzt etwas veraltet sind, also für die Auto-Layout-Fans da draußen.

Auto-Layout macht dieses Problem ziemlich trivial. Angenommen, wir fügen das Label zu UIView *view hinzu, wird der folgende Code dies erreichen:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
[label setText:@"Some text here"];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
[view addSubview:label];

[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label]|" options:0 metrics:nil views:@{@"label": label}]];
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]" options:0 metrics:nil views:@{@"label": label}]];

Die Höhe der Beschriftung wird automatisch berechnet (unter Verwendung von intrinsicContentSize), und die Beschriftung wird von Kante zu Kante horizontal am oberen Rand von view positioniert.

14
petehare

Ich wollte ein Etikett haben, das aus mehreren Zeilen, einer minimalen Schriftgröße und horizontal und vertikal in der übergeordneten Ansicht zentriert sein konnte. Ich habe mein Label programmatisch zu meiner Ansicht hinzugefügt:

- (void) customInit {
    // Setup label
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    self.label.numberOfLines = 0;
    self.label.lineBreakMode = UILineBreakModeWordWrap;
    self.label.textAlignment = UITextAlignmentCenter;

    // Add the label as a subview
    self.autoresizesSubviews = YES;
    [self addSubview:self.label];
}

Und als ich dann den Text meines Labels ändern wollte ...

- (void) updateDisplay:(NSString *)text {
    if (![text isEqualToString:self.label.text]) {
        // Calculate the font size to use (save to label's font)
        CGSize textConstrainedSize = CGSizeMake(self.frame.size.width, INT_MAX);
        self.label.font = [UIFont systemFontOfSize:TICKER_FONT_SIZE];
        CGSize textSize = [text sizeWithFont:self.label.font constrainedToSize:textConstrainedSize];
        while (textSize.height > self.frame.size.height && self.label.font.pointSize > TICKER_MINIMUM_FONT_SIZE) {
            self.label.font = [UIFont systemFontOfSize:self.label.font.pointSize-1];
            textSize = [ticker.blurb sizeWithFont:self.label.font constrainedToSize:textConstrainedSize];
        }
        // In cases where the frame is still too large (when we're exceeding minimum font size),
        // use the views size
        if (textSize.height > self.frame.size.height) {
            textSize = [text sizeWithFont:self.label.font constrainedToSize:self.frame.size];
        }

        // Draw 
        self.label.frame = CGRectMake(0, self.frame.size.height/2 - textSize.height/2, self.frame.size.width, textSize.height);
        self.label.text = text;
    }
    [self setNeedsDisplay];
}

Hoffe das hilft jemandem!

14
Johnus

Ich habe viele der oben genannten Methoden verwendet und möchte nur einen schnellen und schmutzigen Ansatz hinzufügen, den ich verwendet habe:

myLabel.text = [NSString stringWithFormat:@"%@\n\n\n\n\n\n\n\n\n",@"My label text string"];

Stellen Sie sicher, dass die Anzahl der neuen Zeilen in der Zeichenfolge dazu führt, dass Text den verfügbaren vertikalen Platz ausfüllt, und legen Sie das UILabel so fest, dass überschüssiger Text abgeschnitten wird.

Weil manchmal gut genug ist gut genug.

14
Code Roadie

FXLabel (on github) führt dies aus der Box heraus durch Setzen von label.contentMode auf UIViewContentModeTop Diese Komponente wurde nicht von mir hergestellt, aber sie ist eine Komponente, die ich häufig verwende und viele Funktionen hat. Sie scheint gut zu funktionieren.

13
jjxtra

wenn Sie dies lesen, weil der Text in Ihrem Etikett nicht vertikal zentriert ist, denken Sie daran, dass einige Schriftarten nicht gleich gestaltet sind. Wenn Sie z. B. ein Etikett mit der Größe 16 von zapfino erstellen, wird der Text nicht perfekt vertikal zentriert.

wenn Sie jedoch mit Helvetica arbeiten, wird Ihr Text vertikal zentriert.

11
Nir Pengas

Wenn Sie Autolayout verwenden, setzen Sie den vertikalen contentHuggingPriority entweder im Code oder in IB auf 1000. In IB müssen Sie möglicherweise eine Höhenbeschränkung entfernen, indem Sie die Priorität auf 1 setzen und diese dann löschen.

10
phatmann

Unterklasse UILabel und beschränke das Zeichenrechteck wie folgt:

- (void)drawTextInRect:(CGRect)rect
{
    CGSize sizeThatFits = [self sizeThatFits:rect.size];
    rect.size.height = MIN(rect.size.height, sizeThatFits.height);

    [super drawTextInRect:rect];
}

Ich habe die Lösung mit Newline-Polsterung ausprobiert und bin in einigen Fällen auf falsches Verhalten gestoßen. Nach meiner Erfahrung ist es einfacher, das Zeichnungsreflex wie oben beschrieben einzuschränken, als mit numberOfLines zu tun.

P.S. Sie können sich vorstellen, dass UIViewContentMode auf diese Weise problemlos unterstützt wird:

- (void)drawTextInRect:(CGRect)rect
{
    CGSize sizeThatFits = [self sizeThatFits:rect.size];

    if (self.contentMode == UIViewContentModeTop) {
        rect.size.height = MIN(rect.size.height, sizeThatFits.height);
    }
    else if (self.contentMode == UIViewContentModeBottom) {
        rect.Origin.y = MAX(0, rect.size.height - sizeThatFits.height);
        rect.size.height = MIN(rect.size.height, sizeThatFits.height);
    }

    [super drawTextInRect:rect];
}
10
jrc

In Swift

let myLabel : UILabel!

Damit der Text Ihres Etiketts auf den Bildschirm passt und oben angezeigt wird

myLabel.sizeToFit()

So passen Sie die Schriftart der Beschriftung an die Breite des Bildschirms oder eine bestimmte Breite an.

myLabel.adjustsFontSizeToFitWidth = YES

und etwas textAlignment für label:

myLabel.textAlignment = .center

myLabel.textAlignment = .left

myLabel.textAlignment = .right

myLabel.textAlignment = .Natural

myLabel.textAlignment = .Justified

8
Dara Tith

Solange Sie keine komplexen Aufgaben ausführen, können Sie UITextView anstelle von UILabels verwenden.

Deaktivieren Sie den Bildlauf.

Wenn der Text vollständig angezeigt werden soll, müssen nur die Methoden sizeToFit und sizeThatFits: des Benutzers verwendet werden

7
thesummersign

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)
    }
}
7
ma11hew28

Dies ist eine alte Lösung, verwenden Sie Autolayout unter iOS> = 6

Meine Lösung:
1/Zeilen von mir selbst teilen (Labelumbruch-Einstellungen ignorieren)
2/Linien von mir zeichnen (Labelausrichtung ignorieren)


@interface UITopAlignedLabel : UILabel

@end

@implementation UITopAlignedLabel

#pragma mark Instance methods

- (NSArray*)splitTextToLines:(NSUInteger)maxLines {
    float width = self.frame.size.width;

    NSArray* words = [self.text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSMutableArray* lines = [NSMutableArray array];

    NSMutableString* buffer = [NSMutableString string];    
    NSMutableString* currentLine = [NSMutableString string];

    for (NSString* Word in words) {
        if ([buffer length] > 0) {
            [buffer appendString:@" "];
        }

        [buffer appendString:Word];

        if (maxLines > 0 && [lines count] == maxLines - 1) {
            [currentLine setString:buffer];
            continue;
        }

        float bufferWidth = [buffer sizeWithFont:self.font].width;

        if (bufferWidth < width) {
            [currentLine setString:buffer];
        }
        else {
            [lines addObject:[NSString stringWithString:currentLine]];

            [buffer setString:Word];
            [currentLine setString:buffer];
        }
    }

    if ([currentLine length] > 0) {
        [lines addObject:[NSString stringWithString:currentLine]];
    }

    return lines;
}

- (void)drawRect:(CGRect)rect {
    if ([self.text length] == 0) {
        return;
    }

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, self.textColor.CGColor);
    CGContextSetShadowWithColor(context, self.shadowOffset, 0.0f, self.shadowColor.CGColor);

    NSArray* lines = [self splitTextToLines:self.numberOfLines];
    NSUInteger numLines = [lines count];

    CGSize size = self.frame.size;
    CGPoint Origin = CGPointMake(0.0f, 0.0f);

    for (NSUInteger i = 0; i < numLines; i++) {
        NSString* line = [lines objectAtIndex:i];

        if (i == numLines - 1) {
            [line drawAtPoint:Origin forWidth:size.width withFont:self.font lineBreakMode:UILineBreakModeTailTruncation];            
        }
        else {
            [line drawAtPoint:Origin forWidth:size.width withFont:self.font lineBreakMode:UILineBreakModeClip];
        }

        Origin.y += self.font.lineHeight;

        if (Origin.y >= size.height) {
            return;
        }
    }
}

@end
6
Sulthan

In UILabel ist eine vertikale Textausrichtung nicht möglich. Sie können jedoch die Höhe der Beschriftung mit der sizeWithFont:-Methode von NSString dynamisch ändern und X und Y nach Belieben einstellen.

Sie können UITextField verwenden. Es unterstützt das contentVerticalAlignment -Peoperty , da es eine Unterklasse von UIControl ist. Sie müssen die Variable userInteractionEnabled auf NO setzen, damit der Benutzer keinen Text eingeben kann.

6
atul awasthi

Wenn Sie eine eigene benutzerdefinierte Ansicht erstellen, können Sie Folgendes tun:

- (void)drawRect:(CGRect)rect
{
    CGRect bounds = self.bounds;
    [self.textColor set];
    [self.text drawInRect:bounds
                 withFont:self.font
            lineBreakMode:UILineBreakModeTailTruncation
                alignment:self.textAlignment];
}
6
jcjimenez

Ich weiß, dass dies ein alter Beitrag ist, aber vertikal ausgerichteter Text ist ein RIESIGES Problem (zumindest für mich ist es das) und ich dachte mir, dass ich diese Lösung teilen sollte, da ich selbst keine finden konnte. 

Die Verwendung von drawRect ist meiner Meinung nach etwas teuer. Wenn Sie ein UILabel vertikal ausrichten möchten, verwenden Sie kein UILabel. Verwenden Sie eine UITextView (mehrzeiliges UITextField) und beobachten Sie die content -Eigenschaft wie folgt:

- (UITextView*)textView{
     if(!_textView){
        UIEdgeInsets insets = UIEdgeInsetsMake(0, 50, 0, 5);
        CGRect frame = CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);
        _textView = [[UITextView alloc]initWithFrame:UIEdgeInsetsInsetRect(frame, insets)];
        _textView.delegate = self;
        _textView.scrollEnabled = YES;
        _textView.bounces = YES;
        _textView.backgroundColor = [UIColor whiteColor];
        [_textView setUserInteractionEnabled:NO];
        [_textView addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
    }
    return _textView;
}

 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:    (NSDictionary *)change context:(void *)context {
UITextView *tv = object;

CGFloat height = [tv bounds].size.height;
CGFloat contentheight;

#ifdef __IPHONE_7_0
    contentheight = [tv sizeThatFits:CGSizeMake(tv.frame.size.width, FLT_MAX)].height;
#else
    contentheight = [tv contentSize].height;
#endif

    switch(self.verticalAlignment) {
        case VerticalAlignmentBottom:{
            CGFloat topCorrect = ([tv bounds].size.height - contentheight);
            topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
            tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
        }
        break;
        case VerticalAlignmentMiddle:{
            CGFloat topCorrect = (height - contentheight * [tv zoomScale])/2.0;
            topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
            tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
        }
            break;
        case VerticalAlignmentTop:{
            tv.contentOffset = (CGPoint){.x = 0, .y = 0 };
        }
            break;
        default:
            break;
    }
}

Grundsätzlich wird hier die Klasse festgelegt, in der wir uns als Beobachter befinden. Dabei wird die contentSize -Eigenschaft mit der Option NSKeyValueObservingOptionNew betrachtet. Wenn also der Inhalt geändert wird, wird -(void)observeValueForKeyPath:ofObject:change:context: aufgerufen, und Sie können eine Offsetgröße berechnen, um den Text auszurichten passend. 

Ich kann das nicht anerkennen, die ursprüngliche Idee kam von hier . Diese Lösung funktioniert jedoch nicht unter iOS7. Nachdem ich einige Stunden lang SO herumgefahren bin, habe ich Folgendes gefunden: iOS 7-Fix für vertikale Ausrichtung . Die Schlüsselzeile dort ist contentheight = [tv sizeThatFits:CGSizeMake(tv.frame.size.width, FLT_MAX)].height;. Aus irgendeinem Grund in iOS 7 funktioniert das Abrufen der contentSize-Höhe nicht. Dies behebt das Problem. Keine der beiden Lösungen funktionierte von alleine, aber nach einigem Basteln konnte ich die obige Lösung zusammen synthetisieren. 

6
barndog
yourLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
5
mbo42

Swift 2.0:

Erstellen Sie konstante Aufzählungswerte in einer leeren Swift-Datei.

//  AppRef.Swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

 case VERTICAL_ALIGNMENT_TOP = "VerticalAlignmentTop"
 case VERTICAL_ALIGNMENT_MIDDLE = "VerticalAlignmentMiddle"
 case VERTICAL_ALIGNMENT_BOTTOM = "VerticalAlignmentBottom"

}

UILabel Extension verwenden:

Mache eine leere Swift-Klasse und benenne sie. Fügen Sie folgendes hinzu

//  AppExtensions.Swift

import Foundation
import UIKit

extension UILabel{ 
 func makeLabelTextPosition (sampleLabel :UILabel?, positionIdentifier : String) -> UILabel
 {
  let rect = sampleLabel!.textRectForBounds(bounds, limitedToNumberOfLines: 0)

  switch positionIdentifier
  {
  case "VerticalAlignmentTop":
   sampleLabel!.frame = CGRectMake(bounds.Origin.x+5, bounds.Origin.y, rect.size.width, rect.size.height)
   break;

  case "VerticalAlignmentMiddle":
   sampleLabel!.frame = CGRectMake(bounds.Origin.x+5,bounds.Origin.y + (bounds.size.height - rect.size.height) / 2,
    rect.size.width, rect.size.height);
   break;

  case "VerticalAlignmentBottom":
   sampleLabel!.frame = CGRectMake(bounds.Origin.x+5, bounds.Origin.y + (bounds.size.height - rect.size.height),rect.size.width, rect.size.height);
   break;

  default:
   sampleLabel!.frame = bounds;
   break;
  }
  return sampleLabel!

 }
}

Verwendungszweck :  

myMessageLabel.makeLabelTextPosition(messageLabel, positionIdentifier: UILabelTextPositions.VERTICAL_ALIGNMENT_TOP.rawValue)
5
A.G

Ich arbeitete auch an diesem speziellen Problem, also habe ich die Ideen von DS und nevan king übernommen und sie im Grunde zu einer Unterklasse zusammengefasst, die eine vertikale Ausrichtungseigenschaft implementiert, die es Ihnen ermöglicht, Änderungen vorzunehmen die Ausrichtung mehr als nur einmal. Es leiht sich den Typ UIControlContentVerticalAlignment und unterstützt auch UIControlContentVerticalAlignmentFill.

Nach allem, was ich gesehen habe, scheint numberOfLines unbrauchbar zu sein, wenn es um die vertikale Ausrichtung geht. In dieser Unterklasse wird sie beim Anwenden der vertikalen Ausrichtung immer auf 0 gesetzt. Außerdem müssen Sie lineBreakMode selbst festlegen, falls Sie dies möchten eine mehrzeilige Textbeschriftung.

Da ist es: QALabel auf GitHub

5
vbwx

Ich riff den Vorschlag von dalewking ab und fügte ein UIEdgeInset hinzu, um eine einstellbare Marge zu ermöglichen. Gute Arbeit um.

- (id)init
{
    if (self = [super init]) {
        contentEdgeInsets = UIEdgeInsetsZero;
    }

    return self;
}

- (void)layoutSubviews
{
    CGRect localBounds = self.bounds;
    localBounds = CGRectMake(MAX(0, localBounds.Origin.x + contentEdgeInsets.left), 
                             MAX(0, localBounds.Origin.y + contentEdgeInsets.top), 
                             MIN(localBounds.size.width, localBounds.size.width - (contentEdgeInsets.left + contentEdgeInsets.right)), 
                             MIN(localBounds.size.height, localBounds.size.height - (contentEdgeInsets.top + contentEdgeInsets.bottom)));

    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:[UILabel class]]) {
            UILabel *label = (UILabel*)subview;
            CGSize lineSize = [label.text sizeWithFont:label.font];
            CGSize sizeForText = [label.text sizeWithFont:label.font constrainedToSize:localBounds.size lineBreakMode:label.lineBreakMode];

            NSInteger numberOfLines = ceilf(sizeForText.height/lineSize.height);

            label.numberOfLines = numberOfLines;
            label.frame = CGRectMake(MAX(0, contentEdgeInsets.left), MAX(0, contentEdgeInsets.top), localBounds.size.width, MIN(localBounds.size.height, lineSize.height * numberOfLines)); 
        }
    }
}
5
sean woodward

Für Swift 3 ...

@IBDesignable class TopAlignedLabel: UILabel {
    override func drawText(in rect: CGRect) {
        if let stringText = text {
            let stringTextAsNSString = stringText as NSString
            let labelStringSize = stringTextAsNSString.boundingRect(with: CGSize(width: self.frame.width,height: CGFloat.greatestFiniteMagnitude),
                                                                            options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                                                            attributes: [NSFontAttributeName: font],
                                                                            context: nil).size
            super.drawText(in: CGRect(x:0,y: 0,width: self.frame.width, height:ceil(labelStringSize.height)))
        } else {
            super.drawText(in: rect)
        }
    }
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        layer.borderWidth = 1
        layer.borderColor = UIColor.black.cgColor
    }
}
4
seggy

Es gibt zwei Möglichkeiten, um dieses Problem zu beheben

[mylabel setNumberOfLines:0];
[mylabel sizeToFit];

Der zweite Weg ist jedoch zuverlässiger für diesen Ansatz, d. H.

 CGSize sizeToFit = [label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
 [mylabel setFrame:CGRectMake(mylabel.frame.Origin.x, mylabel.frame.Origin.y, sizeToFit.width, sizeToFit.height)];

die Eingabe von "\ n" ist nicht so gut, aber wenn Sie die Einschränkungen und die Größe der anzuzeigenden Daten kennen, kann dies gut funktionieren, kann jedoch nicht erweitert werden, wenn der Text länger als die Etikettengröße ist. Der zweite Weg setzt den Rahmen letztendlich entsprechend der Größe des anzuzeigenden Textes.

4
SunnyChattha

Dieser Code hilft Ihnen, den Text nach oben auszurichten und die Beschriftungshöhe als Textinhalt festzulegen.

anweisung, den untenstehenden Code zu verwenden

isHeightToChange Standardmäßig ist es wahr, dass die Beschriftungshöhe automatisch mit dem Textinhalt übereinstimmt .isHeightToChange Wenn es falsch ist, wird der Text nach oben ausgerichtet, ohne dass die Beschriftungshöhe abnimmt.

#import "DynamicHeightLable.h"

@implementation DynamicHeightLable
@synthesize isHeightToChange;
- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // Initialization code.
        self.isHeightToChange=FALSE;//default

    }
    return self;
}
- (void)drawTextInRect:(CGRect)rect
{
    if(!isHeightToChange){
    CGSize maximumLabelSize = CGSizeMake(self.frame.size.width,2500);

    CGFloat height = [self.text sizeWithFont:self.font
                           constrainedToSize:maximumLabelSize
                               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];

}
- (void) layoutSubviews
{
    [super layoutSubviews];
       if(isHeightToChange){
     CGRect ltempFrame = self.frame;
    CGSize maximumLabelSize = CGSizeMake(self.frame.size.width,2500);

    CGFloat height = [self.text sizeWithFont:self.font
                           constrainedToSize:maximumLabelSize
                               lineBreakMode:self.lineBreakMode].height;
    if (self.numberOfLines != 0) {
        height = MIN(height, self.font.lineHeight * self.numberOfLines);
    }
    ltempFrame.size.height = MIN(ltempFrame.size.height, height);

    ltempFrame.size.height=ltempFrame.size.height;
    self.frame=ltempFrame;
       }
}
@end
3
Ramesh Muthe

Für diejenigen von Ihnen mit benutzerdefinierten Tabellenzellen, die versuchen, dieses Problem zu beheben, fügen Sie der benutzerdefinierten Tabellenzellklasse Folgendes hinzu:

Swift 2.2:

override func layoutSubviews() {
    labelName.sizeToFit()
}

Das hat mein Problem gelöst.

3
Elliott Davies

(Stand: 7. März 2018)

Swift 4

let maxFrameHeight = 75

myLabel = UILabel()
myLabel.frame = CGRect(x: 9, y: 9, width: 126, height: maxFrameHeight)
myLabel.text = "my labels text displayed"
myLabel.numberOfLines = 0

myLabel.sizeToFit()
let newFrameHeight = myLabel.frame.size.height
let safeNewHeight = min(newFrameHeight, maxFrameHeight)

myLabel.frame = CGRect(x: 9, y: 9, width: 126, height: safeNewHeight)

Dadurch wird das gewünschte Ergebnis erzielt und sichergestellt, dass die neue Höhe des UILabels eine bestimmte maximale Höhe nicht überschreitet, die Sie für dieses Etikett wünschen.

3
BennyTheNerd

Anstatt sizeToFit zu verwenden, können Sie die Höhe der Beschriftung manuell ändern.

CGSize size = [descLabel.text sizeWithFont:descLabel.font constrainedToSize:CGSizeMake(labelWidth, labelHeight)];
CGRect frame = descLabel.frame;
frame.size.height = size.height;    
[yourLabel setFrame:frame];

Die zurückgegebene Größe passt am besten zum Inhalt Ihres Labels. Wenn die Etikettenhöhe an den Inhalt angepasst wird, treten keine Probleme auf, wenn der Inhalt in der Mitte des Etiketts positioniert wird. 

3
KarenAnne

Aufbauend auf allen anderen veröffentlichten Lösungen habe ich eine einfache kleine UILabel-Unterklasse erstellt, die die vertikale Ausrichtung für Sie übernimmt, wenn Sie die Ausrichtungseigenschaft festlegen. Dadurch wird auch das Etikett bei Orientierungsänderungen aktualisiert, die Höhe wird auf den Text beschränkt und die Breite des Etiketts bleibt in der ursprünglichen Größe.

.h

@interface VAlignLabel : UILabel
@property (nonatomic, assign) WBZVerticalAlignment alignment;
@end


.m

 -(void)setAlignment:(WBZVerticalAlignment)alignment{

    _alignment = alignment;

    CGSize s = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(self.frame.size.width, 9999) lineBreakMode:NSLineBreakByWordWrapping];

    switch (_alignment)
    {
        case wbzLabelAlignmentVerticallyTop:
            self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, self.frame.size.width, s.height);
            break;
        case wbzLabelAlignmentVerticallyMiddle:
            self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y + (self.frame.size.height - s.height)/2, self.frame.size.width, s.height);
            break;
        case wbzLabelAlignmentVerticallyBottom:
            self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y + (self.frame.size.height - s.height), self.frame.size.width, s.height);
            break;
        default:
            break;
    }
}

-(void)layoutSubviews{
    [self setAlignment:self.alignment];
}
2
cohen72

Einfache Lösung für dieses Problem ... 

Platzieren Sie eine UIStackView unter dem Etikett. 

Verwenden Sie dann AutoLayout, um einen vertikalen Abstand von 0 zu der Beschriftung festzulegen, und beschränken Sie den oberen Rand auf den vorherigen Bereich des Etiketts. Das Label wächst nicht, die StackView wird Was mir dabei gefällt, ist, dass die Stack-Ansicht nicht gerendert wird. Es ist also keine Zeitverschwendung für das Rendern. Obwohl es AutoLayout-Berechnungen durchführt.

Sie werden wahrscheinlich mit ContentHugging und Resistance spielen müssen, aber das ist auch ganz einfach. 

Hin und wieder google ich dieses Problem und komme hierher zurück. Dieses Mal hatte ich eine Ideia, die meiner Meinung nach die einfachste ist, und ich denke nicht, dass dies eine schlechte Leistung ist. Ich muss sagen, dass ich nur AutoLayout verwende und die Berechnung von Frames nicht wirklich stören möchte. Das ist nur ... yuck.

1
Nuno Gonçalves

Dies kann mit mehr Flexibilität erfolgen, indem Sie im Interface Builder einen height constraint für das Label festlegen, ihn mit einem IBOutlet an den Code binden und diese Höhe ändern, um den Text in einer konkreten vertikalen Position anzuzeigen. Beispiel für die Ausrichtung von Mitte und Boden:

labelHeightConstraint.constant = centerAlignment ? 30 : 15
layoutIfNeeded()
0
Ruben Marin

Hier ist eine Lösung in Swift 4.0:

func viewDidLoad() {

    super.viewDidLoad()

    // 20 point top and left margin. Sized to leave 20 pt at right.
    let labelFrame = CGRect(x: 20, y: 20, width: 280, height: 150)
    let myLabel = UILabel(frame: labelFrame)
    myLabel.backgroundColor = UIColor.orange

    let labelText = "I am the very model of a modern Major-General, 
    I've information vegetable, animal, and mineral"
    myLabel.text = labelText

    // Tell the label to use an unlimited number of lines
    myLabel.numberOfLines = 0
    myLabel.sizeToFit()

    view.addSubview(myLabel) // add label
}
0
Ashish