Passen Sie die UILabel-Höhe je nach Text an


315

Bedenken Sie, dass ich den folgenden Text in einer UILabel(langen Zeile dynamischen Textes) habe:

Da die Anzahl der außerirdischen Armeen dem Team weit überlegen ist, müssen die Spieler die postapokalyptische Welt zu ihrem Vorteil nutzen, z. B. um Deckung hinter Müllcontainern, Säulen, Autos, Trümmern und anderen Objekten zu suchen.

Ich möchte die Größe ändern, UILabel'sdamit der Text hineinpasst. Ich verwende die folgenden Eigenschaften von UILabel, um den Text zum Umbrechen zu bringen.

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Bitte lassen Sie mich wissen, wenn ich nicht in die richtige Richtung gehe. Vielen Dank.



Antworten:


409

sizeWithFont constrainedToSize:lineBreakMode:ist die zu verwendende Methode. Ein Beispiel für die Verwendung finden Sie unten:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Dies verwendet 9999, wie würden Sie es flexibel auf den Text machen?
Quantumpotato

1
@quantumpotato 9999 ist nur ein Platzhalter für den maximalen Platz, den der Text einnehmen darf. Sie können dort eine beliebige Nummer verwenden, die für Ihre Benutzeroberfläche geeignet ist.
PyjamaSam

9
Wenn Sie Ihre Etiketten so dimensionieren, machen Sie es falsch . Sie sollten verwenden [label sizeToFit].
Marián Černý

5
Vergessen Sie nicht, dass dies sizeWithFontin iOS 7 veraltet ist. Stackoverflow.com/questions/18897896/…
attomos

7
Es ist veraltet;
msmq

242

Sie gingen in die richtige Richtung. Alles was Sie tun müssen ist:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];

5
Die passende Größe war genau das, was ich brauchte, um den Text zu umbrechen, lange mit myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble

2
Eine viel einfachere Lösung als die als richtig gekennzeichnete Antwort und funktioniert genauso gut.
Memmons

4
@Inder Kumar Rathore - Ich benutze dies die ganze Zeit für mehrere Zeilen, daher die Anzahl der Zeilen = 0; Ich denke, es fehlt, zuerst die bevorzugte Breite einzustellen, aber ich nahm an, dass dies bereits mit dem Init des UILabel geschehen war.
DonnaLea

@Donna .. Ich werde nicht bevorzugt mit .. sprichst du über seinen Rahmen?
Inder Kumar Rathore

@ DonnaLea, vielen Dank. Ihre einfache Herangehensweise an die Lösung hat mir auch geholfen, mein Problem zu lösen.
Naved

44

In iOS 6 hat Apple eine Eigenschaft hinzugefügt UILabel , die dynamische vertikale Größenanpassung vereinfacht stark von Etiketten: preferredMaxLayoutWidth .

Die Verwendung dieser Eigenschaft in Kombination mit lineBreakMode = NSLineBreakByWordWrapping und der sizeToFit- Methode ermöglicht die einfache Größenänderung einer UILabel-Instanz auf die Höhe, die den gesamten Text enthält.

Ein Zitat aus der iOS-Dokumentation:

bevorzugteMaxLayoutWidth Die bevorzugte maximale Breite (in Punkten) für ein mehrzeiliges Etikett.

Diskussion Diese Eigenschaft wirkt sich auf die Größe des Etiketts aus, wenn Layoutbeschränkungen darauf angewendet werden. Wenn der Text während des Layouts die durch diese Eigenschaft angegebene Breite überschreitet, wird der zusätzliche Text in eine oder mehrere neue Zeilen geleitet, wodurch die Höhe der Beschriftung erhöht wird.

Eine Probe:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...

39

Überprüfen Sie diese Funktion einwandfrei, ohne eine einzelne Codezeile hinzuzufügen. (Verwenden von Autolayout)

Ich habe eine Demo für Sie gemäß Ihren Anforderungen erstellt. Laden Sie es von unten Link herunter,

Autoresize UIView und UILabel

Schritt für Schritt Anleitung :-

Schritt 1: - Setzen Sie die Einschränkung auf UIView

1) Führend 2) Top 3) Nachlauf (Aus der Hauptansicht)

Geben Sie hier die Bildbeschreibung ein

Schritt 2: - Setzen Sie die Beschränkung auf Beschriftung 1

1) Führen 2) Top 3) Nachlaufen (Aus der Übersicht)

Geben Sie hier die Bildbeschreibung ein

Schritt 3: - Setzen Sie die Beschränkung auf Beschriftung 2

1) Führen 2) Schleppen (Aus der Übersicht)

Geben Sie hier die Bildbeschreibung ein

Schritt 4: - Am schwierigsten ist es, UILabel von UIView einen Botton zu geben.

Geben Sie hier die Bildbeschreibung ein

Schritt 5: - (Optional) Setzen Sie die Einschränkung auf UIButton

1) Führend 2) Unten 3) Nachlauf 4) Feste Höhe (aus der Hauptansicht)

Geben Sie hier die Bildbeschreibung ein

Ausgabe :-

Geben Sie hier die Bildbeschreibung ein

Hinweis: - Stellen Sie sicher, dass Sie in der Label-Eigenschaft Anzahl der Zeilen = 0 festgelegt haben.

Geben Sie hier die Bildbeschreibung ein

Ich hoffe, diese Informationen reichen aus, um Autoresize UIView entsprechend der Größe von UILabel und Autoresize UILabel gemäß Text zu verstehen.


Und was ist, wenn Sie auch einige Ansichten unter der Ansicht mit weißem Hintergrund haben möchten? Wenn Sie ihm keine Höhe geben, werden in SB einige rote Linien für "Einschränkungen für: Y-Position oder -Höhe"
angezeigt

Dies muss als die richtige Antwort markiert werden. Dies ist der richtige Weg mit ib.
Rana Tallal

So viel Aufwand, aber das beantwortet die Frage nicht ...
SPQR3

@ SPQR3 was ist das Problem? Es hat vielen Menschen geholfen und es funktioniert gut.
Badal Shah

36

Stattdessen können Sie dies programmgesteuert in Storyboard / XIB ausführen, während Sie entwerfen.

  • Setzen Sie die Eigenschaft für die Anzahl der Zeilen von UIlabel im Attributinspektor auf 0 .
  • Stellen Sie dann die Breitenbeschränkung / (oder) führende und nachfolgende Einschränkung gemäß der Anforderung ein.
  • Stellen Sie dann die Höhenbeschränkung auf den Mindestwert ein . Wählen Sie schließlich die hinzugefügte Höhenbeschränkung aus und ändern Sie im Größeninspektor neben dem Attributinspektor die Beziehung der Höhenbeschränkung von gleich - größer als .

Dieser funktioniert für UILabel, eingebettet in eine benutzerdefinierte xib-Zelle in einer UITableView.
Gang Fang

Gemäß Ihrer Antwort habe ich eine konstante Höhe für mein Etikett festgelegt und diese Priorität auf Niedrig (250) gesetzt, und Fehler verschwinden. (Muss nicht gleich gesetzt werden - größer als)
Hamid Reza Ansari

15

Vielen Dank für die Hilfe, hier ist der Code, den ich ausprobiert habe und der für mich funktioniert

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];

2
sizeWithFont ist veraltet.
msmq

12

Lösung für iOS7 vor und iOS7 oben

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end

Wo soll ich diese Methode in der Unterklasse von UITableViewController aufrufen?
Homam

Wenn Sie die Etikettenhöhe berechnen möchten, rufen Sie diese Methode auf. Passen Sie dann die Höhe der Tabellenansicht an. Hier haben Sie die Höhe der Tabellenansicht für die Zeile bei der Indexmethode. Berechnen Sie den gesamten vertikalen Beschriftungstext nach Bedarf
Vijay-Apple-Dev.blogspot.com

Vijay sizeWithFont ist beraubt.
user3182143

10

Da sizeWithFont veraltet ist, verwende ich stattdessen dieses.

Dieser erhält beschriftungsspezifische Attribute.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:label.font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){label.frame.size.width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

    return ceil(rect.size.height);
}

6

Hier ist eine Kategorieversion:

UILabel + AutoSize.h #import

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end

6

Sie können die TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath Methode beispielsweise folgendermaßen implementieren :

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

Verwenden Sie auch NSStringdie sizeWithFont:constrainedToSize:lineBreakMode:Methode von ' , um die Höhe des Texts zu berechnen.


6

UILabel-Erweiterung basierend auf dieser Antwort für Swift 4 und höher

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

Kann verwendet werden wie:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()

4

Und für diejenigen, die auf iOS 8 migrieren, gibt es hier eine Klassenerweiterung für Swift:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}

4

Der einfachste und bessere Weg, der für mich funktioniert hat, bestand darin, die Höhenbeschränkung auf das Etikett anzuwenden und die Priorität im Storyboard auf niedrig zu setzen , dh (250).

Dank des Storyboards müssen Sie sich also keine Gedanken über die programmgesteuerte Berechnung von Höhe und Breite machen.


wird es mit xibs funktionieren?
Jayant Rawat

4

Mein Ansatz zur Berechnung der dynamischen Höhe von UILabel.

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

Wrap to function:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}

3

Aktualisierte Methode

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}

3

Dies ist eine Codezeile zum Abrufen der UILabel-Höhe mithilfe von Objective-c:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

und mit .height erhalten Sie die Höhe des Etiketts wie folgt:

neededSize.height

Beste aktuelle Antwort.
Mike

3

Sie können die Höhe mit dem folgenden Code ermitteln

Du musst bestehen

  1. Text 2. Schriftart 3. Etikettenbreite

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
       let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
       label.lineBreakMode = NSLineBreakMode.byWordWrapping
       label.font = font
       label.text = text
       label.sizeToFit()
    
       return label.frame.height
    }

2

Danke für diesen Beitrag. Es hat mir sehr geholfen. In meinem Fall bearbeite ich den Text auch in einem separaten View Controller. Mir ist aufgefallen, dass ich:

[cell.contentView addSubview:cellLabel];

in der tableView: cellForRowAtIndexPath: Methode, mit der die Beschriftungsansicht bei jeder Bearbeitung der Zelle kontinuierlich über der vorherigen Ansicht gerendert wurde. Der Text wurde pixelig und wenn etwas gelöscht oder geändert wurde, war die vorherige Version unter der neuen Version sichtbar. So habe ich das Problem gelöst:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

Keine seltsamen Schichten mehr. Wenn es einen besseren Weg gibt, dies zu handhaben, lassen Sie es mich bitte wissen.


2
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

Verwenden Sie dies hier. Alle Eigenschaften werden auf dem Etikett verwendet und testen Sie es, indem Sie den Text in der Datei itemTitle.text als erhöhen

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

Es zeigt die perfekte Antwort nach Bedarf


2

Sie können es auch als Methode verwenden. @ Pyjamasam ist sehr wahr, also mache ich nur seine Methode. Es kann für jemand anderen hilfreich sein

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

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

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

und einfach so einstellen

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];

2

Um dies in Swift3 zu tun, ist der folgende Code:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)

2

Hinzufügen zu den obigen Antworten:

Dies kann leicht über das Storyboard erreicht werden.

  1. Legen Sie die Einschränkung für UILabel fest. (In meinem Fall habe ich die obere, linke und feste Breite festgelegt.)
  2. Setzen Sie die Anzahl der Zeilen im Attributinspektor auf 0
  3. Setzen Sie im Attributinspektor den Zeilenumbruch auf WordWrap .

UILabel Höhenanpassung


1

Eine Zeile ist Chris 'Antwort ist falsch.

newFrame.size.height = maximumLabelSize.height;

sollte sein

newFrame.size.height = expectedLabelSize.height;

Davon abgesehen ist es die richtige Lösung.


1

Endlich hat es funktioniert. Danke Jungs.

Ich habe es nicht zum Laufen gebracht, weil ich versucht habe, die Größe des Etiketts in der heightForRowAtIndexPathMethode zu ändern :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

und (yeah dumm von mir), ich habe die Größe des Etiketts auf die Standardeinstellung in der cellForRowAtIndexPathMethode geändert - ich habe den Code übersehen, den ich zuvor geschrieben hatte:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

1
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}

2
Können Sie erklären, wie Ihre Lösung das Problem des OP löst?

1
Sie können UITableViewCell nicht fragen * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; in heightForRowAtIndexPath werden Sie eine Endlosschleife
Peter Lapisu

1
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];

1

Mein Code:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);

1

Diese Methode ergibt eine perfekte Höhe

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


title_size = [text boundingRectWithSize:constraint
                                options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : font }
                                context:nil].size;

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}

Kopieren Sie keine Inhalte von anderen Stellen ohne eindeutige Zuordnung. Es wird als Plagiat angesehen. Siehe stackoverflow.com/help/referencing ( stackoverflow.com/a/25158206/444991 ).
Matt

1

Swift 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

Die interessanten Zeilen stehen sizeToFit()in Verbindung mit dem Setzen von a frame.size.heightauf den maximalen Gleitkommawert. Dies gibt Platz für langen Text, sizeToFit()zwingt ihn jedoch dazu, nur das Notwendige zu verwenden, ruft ihn jedoch IMMER nach dem Setzen von auf .frame.size.height.

Ich empfehle, ein .backgroundColorfür Debug-Zwecke festzulegen. Auf diese Weise können Sie sehen, wie der Frame für jeden Fall gerendert wird.


1
yourLabel.frame.heightist eine Eigenschaft nur zu bekommen
Phil Hudson

2
yourLabel.frame.size.width und yourLabel.frame.size.height sind ebenfalls schreibgeschützt
CalZone

1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Bitte legen Sie im Storyboard Einschränkungen für UILable fest, einschließlich oben links unten rechts

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.