it-swarm.com.de

UILabel - Auto-Size-Label zum Anpassen von Text?

Ist es möglich, die UILabel-Box/die Begrenzungen automatisch an den enthaltenen Text anzupassen? (Es ist mir egal, ob er größer als die Anzeige ist)

Wenn ein Benutzer also "Hallo" oder "Mein Name ist wirklich lang, ich möchte, dass er in dieses Feld passt" eingegeben wird, wird er niemals abgeschnitten und das Label wird entsprechend "erweitert".

135
wayneh

Bitte sehen Sie sich meine Gist an, wo ich eine Kategorie für UILabel für etwas sehr ähnliches erstellt habe. Meine Kategorie lässt eine UILabel-Dehnung um die Höhe des gesamten Inhalts zu: https://Gist.github.com/1005520

Oder checke diesen Beitrag: https://stackoverflow.com/a/7242981/662605

Dies würde die Höhe dehnen, aber Sie können es leicht ändern, um es in die andere Richtung zu bringen und die Breite mit etwas wie diesem zu strecken. Ich glaube, was Sie tun möchten:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

Sie können eher die sizeToFit-Methode der UIView-Klasse verwenden, die Anzahl der Zeilen jedoch auf 1 setzen, um sicher zu sein.


iOS 6 Update

Wenn Sie AutoLayout verwenden, haben Sie eine integrierte Lösung. Wenn Sie die Anzahl der Zeilen auf 0 setzen, wird die Größe des Labels durch das Framework entsprechend angepasst (zusätzliche Höhe wird hinzugefügt), um es an Ihren Text anzupassen.


iOS 8 Update

sizeWithFont: ist veraltet, verwenden Sie stattdessen sizeWithAttributes::

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}
96
Daniel

Die Verwendung von [label sizeToFit]; erzielt das gleiche Ergebnis von Daniels Category.

Obwohl ich empfehle, Autolayout zu verwenden und die Größe der Beschriftung basierend auf Einschränkungen ändern zu lassen. 

Wenn wir möchten, dass UILabel basierend auf der Textgröße verkleinert und erweitert wird, ist das Storyboard mit Autolayout die beste Option. Nachfolgend die Schritte, um dies zu erreichen

Schritte

  1. Setzen Sie UILabel in den View-Controller und platzieren Sie es wo immer Sie möchten. Fügen Sie auch 0 für die numberOfLines-Eigenschaft von UILabel ein.

  2. Geben Sie ihm die Beschränkung für die obere, führende und nachlaufende Leerzeichen-Pin.

enter image description here

  1. Jetzt wird es eine Warnung geben. Klicken Sie auf den gelben Pfeil.

enter image description here

  1. Klicken Sie auf Update Frame und klicken Sie auf Fix Misplacement. Jetzt wird dieses UILabel verkleinert, wenn der Text kleiner ist, und erweitert, wenn der Text mehr ist.
30
Yogesh Suthar

Dies ist nicht so kompliziert wie einige andere Antworten.

 enter image description here

Befestigen Sie die linke und obere Kante

Verwenden Sie das automatische Layout, um Einschränkungen hinzuzufügen, um die linke und obere Seite des Etiketts zu fixieren. 

 enter image description here

Danach wird die Größe automatisch angepasst.

Anmerkungen

  • Fügen Sie keine Einschränkungen für die Breite und Höhe hinzu. Labels haben basierend auf ihrem Textinhalt eine intrinsic - Größe.
  • Danke an diese Antwort für Hilfe dabei.
  • Bei Verwendung des automatischen Layouts muss keine sizeToFit eingestellt werden. Mein vollständiger Code für das Beispielprojekt ist hier:

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
    
  • Wenn Sie möchten, dass Ihr Etikett Zeilenumbruch aufweist, setzen Sie die Anzahl der Zeilen in IB auf 0 und fügen Sie myLabel.preferredMaxLayoutWidth = 150 // or whatever im Code hinzu. (Ich habe meinen Knopf auch an der Unterseite des Etiketts fixiert, damit er sich nach unten bewegt, wenn die Etikettenhöhe ansteigt.)

 enter image description here

  • Wenn Sie in einer UITableViewCell nach dynamischen Größenbeschriftungen suchen, dann sehen Sie diese Antwort .

 enter image description here

20
Suragch

Verwenden Sie [label sizeToFit];, um den Text in UILabel anzupassen

9
Gaurav Gilani

Ich habe einige Methoden basierend auf Daniels Antwort erstellt. 

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}
5
Doug Baker
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, aSize.width, tmpSize.height);
}

@end

Dies ist eine Kategoriemethode. Sie müssen zuerst Text festlegen und dann diese Methode aufrufen, um die Höhe von UILabel anzupassen.

3
Kaijay Lu

Sie können die Größe Ihres Etiketts anhand von Text und anderen zugehörigen Steuerelementen auf zwei Arten anpassen:

  1. Für iOS 7.0 und höher

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;
    

vor iOS 7.0 könnte dies zur Berechnung der Etikettengröße verwendet werden

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// Andere Steuerelemente basierend auf labelTextHeight umbenennen

CGFloat labelTextHeight = labelTextSize.height;
  1. Wenn Sie die Größe des Textes der Beschriftung nicht berechnen möchten, können Sie -sizeToFit für die Instanz von UILabel as-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text
    

// Danach können Sie den Beschriftungsrahmen erhalten, um andere verwandte Steuerelemente umzubenennen

2
vijeesh

Hier finde ich Arbeiten für meine Situation:

1) Die Höhe des UILabels hat eine Einschränkung von> = 0 mit Autolayout. Die Breite ist festgelegt . 2) Weisen Sie den Text dem UILabel zu, das an dieser Stelle bereits einen Überblick hat (nicht sicher, wie wichtig das ist) . 3) Dann machen Sie:

    label.sizeToFit()
    label.layoutIfNeeded()

Die Höhe des Etiketts ist jetzt richtig eingestellt.

2
Chris Prince
  1. Fügen Sie fehlende Einschränkungen im Storyboard hinzu.
  2. Wählen Sie im Storyboard UILabel und setzen Sie die Attribute "Line" auf 0.
  3. Geben Sie das UILabel an Controller.h mit der ID: label aus
  4. Controller.m und fügen Sie [label sizeToFit]; in viewDidLoad hinzu
2
user2941395

Ich hatte große Probleme mit dem automatischen Layout. Wir haben zwei Container in der Tabellenzelle. Die Größe des zweiten Containers wird abhängig von der Artikelbeschreibung (0 - 1000 Zeichen) geändert, und die Zeilengröße sollte basierend auf ihnen angepasst werden. 

Der fehlende Bestandteil war für die Beschreibung die unterste Einschränkung. 

Ich habe die untere Einschränkung des dynamischen Elements von = 0 in> = 0 geändert.

1
Bojan Tadic

sie können eine Zeilenausgabe anzeigen und dann die Eigenschaft Line = 0 und die Mehrfachausgabe anzeigen. Dann die Eigenschaft Line = 1 und mehr festlegen.  

[self.yourLableName sizeToFit];
0
Dixit Akabari

Passt immer! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];