Ajustați înălțimea UILabel în funcție de text

voturi
289

Luați în considerare am următorul text într - un UILabel(o linie lungă de text dinamic):

Deoarece armata străin outnumbers mult echipa, jucătorii trebuie să folosească lumea post-apocaliptic în avantajul lor, cum ar fi căutarea de acoperire în spatele tomberoane, piloni, mașini, moloz și alte obiecte.

Vreau să redimensiona UILabel'sînălțimea , astfel încât textul poate potrivi. Sunt folosind următoarele proprietăți de UILabela face textul să -și încheie în termen.

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

Vă rog să-mi spuneți dacă nu mă îndreaptă în direcția cea bună. Mulțumiri.

Întrebat 15/01/2009 la 12:19
sursa de către utilizator
În alte limbi...                            


34 răspunsuri

voturi
394

sizeWithFont constrainedToSize:lineBreakMode:este metoda de utilizare. Un exemplu de cum să-l utilizați este de mai jos:

//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;
Publicat 15/01/2009 la 16:01
sursa de către utilizator

voturi
231

Mergeai în direcția cea bună. Tot ce trebuie să faci este:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
Publicat 20/08/2009 la 05:45
sursa de către utilizator

voturi
41

În iOS 6 Apple a adăugat o proprietate la UILabel care simplifică foarte mult redimensionarea verticală dinamică a etichetelor: preferredMaxLayoutWidth .

Folosind această proprietate , în combinație cu lineBreakMode = NSLineBreakByWordWrapping și sizeToFit metodă permite redimensionarea cu ușurință o instanță UILabel la înălțimea care găzduiește întregul text.

Un citat din documentația iOS:

preferredMaxLayoutWidth PREFERAT Lățimea maximă (în puncte) pentru o etichetă multilinie.

Discuție Această proprietate afectează dimensiunea etichetei atunci când constrângerile de aspect sunt aplicate acestuia. În timpul aspect, în cazul în care textul se extinde dincolo de lățimea specificată de această proprietate, textul suplimentar este curs la una sau mai multe linii noi, crescând astfel înălțimea etichetei.

O mostră:

...
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];
...
Publicat 04/11/2013 la 22:14
sursa de către utilizator

voturi
34

În schimb face acest lucru în mod programatic, puteți face acest lucru în Storyboard / XIB în timp ce proiectarea.

  • Set UIlabel de numărul de linii de proprietate 0 în inspector atribut.
  • Apoi setați constrângere / (sau) si final constrângere lățime ca pe cerința.
  • Apoi set de constrângere înălțime , cu o valoare minimă . În cele din urmă selectați constrângerea înălțime adăugat și în inspectorul dimensiunea cel de lângă atribut inspector, schimba constrângerea înălțime de relație de la egal - mai mare .
Publicat 18/06/2015 la 19:08
sursa de către utilizator

voturi
28

Verificați acest lucru perfect fără a adăuga o singură linie de cod. (Utilizarea AutoLayout)

Am făcut un demo pentru tine în funcție de cerințele dumneavoastră. Descărcați - o de mai jos link - ul,

Autoresize UIView și UILabel

Ghid pas cu pas: -

Pasul 1: - Set constrânge la UIView

1) Leading 2) Top 3) Trailing (De la mainview)

introduceți descrierea imaginii aici

Pasul 2: - Set Impuneți eticheta 1

1) Leading 2) Top 3) Trailing (De la e Superview)

introduceți descrierea imaginii aici

Pasul 3: - Set Impuneți eticheta 2

1) Leading 2) Trailing (De la e Superview)

introduceți descrierea imaginii aici

Pasul 4: - Cel mai dificil da Botton la UILabel din UIView.

introduceți descrierea imaginii aici

Pasul 5: - (Opțional) Setați pentru a constrânge UIButton

1) Leading 2) fund 3) Trailing 4) Înălțimea fixă ​​(de la mainview)

introduceți descrierea imaginii aici

Ieșire: -

introduceți descrierea imaginii aici

Notă: - Asigurați - vă că ați setat Numărul de linii = 0 în proprietate Label.

introduceți descrierea imaginii aici

Sper că aceste informații suficiente pentru a înțelege Autoresize UIView în funcție de înălțimea UILabel și Autoresize UILabel Conform textului.

Publicat 26/04/2016 la 10:52
sursa de către utilizator

voturi
15

Multumesc baieti pentru ajutor, aici este codul am încercat, care este de lucru pentru mine

   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];
Publicat 23/11/2010 la 18:20
sursa de către utilizator

voturi
12

Soluție pentru iOS7 prealabilă și iOS7 de mai sus

//
//  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
Publicat 24/02/2014 la 11:16
sursa de către utilizator

voturi
10

Deoarece sizeWithFont este învechită Eu folosesc asta în schimb.

aceasta a lua atributele specifice de etichetare.

-(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);
}
Publicat 13/11/2014 la 23:40
sursa de către utilizator

voturi
6

Aici este o versiune categorie:

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
Publicat 10/04/2013 la 18:58
sursa de către utilizator

voturi
6

Puteți pune în aplicare TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath metoda în felul următor (de exemplu):

#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;

De asemenea , utilizarea NSStringlui sizeWithFont:constrainedToSize:lineBreakMode:metoda pentru a calcula înălțimea textului.

Publicat 15/01/2009 la 15:10
sursa de către utilizator

voturi
4

Cel mai simplu și mai bine modul în care a lucrat pentru mine a fost să aplice înălțimea de constrângere pentru a eticheta și setați prioritatea la cel mai mic , și anume, (250) , în storyboard.

Deci, nu trebuie să se îngrijoreze calcul înălțimea și lățimea programatic, datorită storyboard.

Publicat 16/05/2016 la 16:43
sursa de către utilizator

voturi
4

Iar pentru cei care migreaza la iOS 8, aici este o extensie pentru clasa 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)
        }
    }

}
Publicat 27/08/2014 la 10:18
sursa de către utilizator

voturi
3

Metoda actualizat

+ (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;
}
Publicat 06/07/2015 la 12:21
sursa de către utilizator

voturi
2

Aceasta este o linie de cod pentru a obține UILabel Height folosind Objective-C:

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

și folosind .height veți obține înălțimea etichetei, după cum urmează:

neededSize.height
Publicat 07/03/2017 la 13:22
sursa de către utilizator

voturi
2

Pentru a face acest lucru în Swift3 ca urmare este codul:

 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)
Publicat 01/03/2017 la 13:27
sursa de către utilizator

voturi
2

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()

Liniile sunt interesante sizeToFit()în legătură cu stabilirea unui frame.size.heightla float maxim, acest lucru va da o cameră pentru text lung, dar sizeToFit()va forța să utilizeze numai necesar, dar ÎNTOTDEAUNA numesc după setarea .frame.size.height.

Vă recomandăm setarea unei .backgroundColorscopuri de depanare, în acest fel puteți vedea cadrul fiind prestate pentru fiecare caz.

Publicat 26/11/2015 la 18:51
sursa de către utilizator

voturi
2

Este posibil să-l utilizați ca metodă, de asemenea. @Pyjamasam este foarte mult adevărat, așa că am face doar metoda sa. Acesta poate fi de ajutor pentru unii altcineva

-(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;
}

și doar stabilit ca aceasta

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
Publicat 20/01/2014 la 13:19
sursa de către utilizator

voturi
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];

utilizați acest aici toate proprietățile sunt utilizate pe etichetă și testați-l prin creșterea textul din itemTitle.text ca

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

acesta va arăta răspunsul perfetc ca ai nevoie

Publicat 27/06/2013 la 13:02
sursa de către utilizator

voturi
2

Multumesc pentru acest post. Ma ajutat foarte mult. În cazul meu am editare, de asemenea, textul într-un controler de vedere separat. Am observat că atunci când folosesc:

[cell.contentView addSubview:cellLabel];

în tableView: cellForRowAtIndexPath: metoda care vizualizarea eticheta a fost pronunțată în mod continuu peste partea de sus a vizualizării anterioare de fiecare dată când am editat celula. Textul a devenit pixelat, iar atunci când ceva a fost șters sau modificat, versiunea anterioară a fost vizibilă în noua versiune. Iată cum am rezolvat problema:

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

Nu stratificarea mai ciudat. Dacă există o modalitate mai bună de a rezolva această problemă, Vă rog să-mi spuneți.

Publicat 20/02/2009 la 23:54
sursa de către utilizator

voturi
1

Extensie UILabel bazate pe acest răspuns pentru Swift 4 și de mai sus

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

}

Poate fi folosit ca:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
Publicat 31/10/2017 la 13:00
sursa de către utilizator

voturi
1

Adăugarea la răspunsurile de mai sus:

Acest lucru poate fi realizat cu ușurință prin intermediul storyboard.

  1. constrângere Set pentru UILabel. (În cazul meu am sus, stânga și lățime fixă)
  2. Set Numărul de linii la 0 în Inspector Atribut
  3. Set Intreruperea WordWrap în Inspector atribut.

UILabel Regla

Publicat 18/10/2017 la 22:10
sursa de către utilizator

voturi
1

Abordarea mea pentru a calcula înălțimea dinamică a 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 pentru a funcționa:

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
}
Publicat 19/07/2017 la 06:02
sursa de către utilizator

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

Vă rugăm să setați constrângeri pentru UILable în storyboard, inclusiv partea de sus din dreapta jos din stânga

Publicat 21/01/2017 la 09:07
sursa de către utilizator

voturi
1

Aceasta metoda va da înălțime perfectă

-(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;
}
Publicat 07/04/2016 la 14:00
sursa de către utilizator

voturi
1

Codul meu:

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);
Publicat 08/06/2015 la 06:51
sursa de către utilizator

voturi
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];
Publicat 29/04/2015 la 07:13
sursa de către utilizator

voturi
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;    
}
Publicat 29/08/2012 la 08:29
sursa de către utilizator

voturi
1

O linie este răspunsul lui Chris este greșită.

newFrame.size.height = maximumLabelSize.height;

ar trebui să fie

newFrame.size.height = expectedLabelSize.height;

În afară de asta, este soluția corectă.

Publicat 21/05/2009 la 07:31
sursa de către utilizator

voturi
1

În cele din urmă, ea a lucrat. Vă mulțumesc baieti.

Nu am fost obtinerea - l la locul de muncă pentru că am fost încercarea de a redimensiona eticheta în heightForRowAtIndexPathmetoda:

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

și (da prostie mine), am fost redimensionarea eticheta la valorile implicite în cellForRowAtIndexPathmetoda - am fost cu vedere la codul am scris mai devreme:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Publicat 16/01/2009 la 08:25
sursa de către utilizator

voturi
0

Puteți obține înălțimea folosind codul de mai jos

Trebuie să treci

  1. Text 2. font cu lățime 3. etichetă

    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
    }
    
Publicat 12/04/2018 la 10:43
sursa de către utilizator

voturi
0

Problema este că nici una dintre funcțiile menționate este realiable și pentru unele șir de caractere și font va reveni valoare de înălțime incorectă. Mai ales nu va reuși pentru textele atribuite.

Singura soluție realiable este aici: https://stackoverflow.com/a/4214978/699944 și punctul este de a utiliza CoreText pentru a calcula manual înălțimea de fiecare linie pentru a obține mărimea potrivită. Nu există nici o altă cale de a face cunoscut acest lucru.

Publicat 28/01/2014 la 09:55
sursa de către utilizator

voturi
0

Această metodă va funcționa atât pentru iOS 6 și 7

- (float)heightForLabelSize:(CGSize)maximumLabelSize  Font:(UIFont *)font String:(NSString*)string {

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:font forKey: NSFontAttributeName];

    CGSize adjustedLabelSize = [string maximumLabelSize
                                                                  options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin
                                                               attributes:stringAttributes context:nil].size;
    return adjustedLabelSize.height;
}
else {
    CGSize adjustedLabelSize = [string sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

    return adjustedLabelSize.height;
}

}
Publicat 17/01/2014 la 15:55
sursa de către utilizator

voturi
-1

Când AutoLayout este activat redimensionării nu funcționează :)

Publicat 09/10/2013 la 03:07
sursa de către utilizator

voturi
-2

Actualizări conform iOS7

// If description are available for protocol
protocolDescriptionLabel.text = [dataDictionary objectForKey:@"description"];
[protocolDescriptionLabel sizeToFit];
[protocolDescriptionLabel setLineBreakMode:NSLineBreakByWordWrapping];

CGSize expectedLabelSize = [protocolDescriptionLabel
               textRectForBounds:protocolDescriptionLabel.frame
               limitedToNumberOfLines:protocolDescriptionLabel.numberOfLines].size;
NSLog(@"expectedLabelSize %f", expectedLabelSize.height);

//adjust the label the the new height.
CGRect newFrame = protocolDescriptionLabel.frame;
newFrame.size.height = expectedLabelSize.height;
protocolDescriptionLabel.frame = newFrame;
Publicat 13/11/2013 la 08:51
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more