Dostosuj wysokość UILabel w zależności od tekstu

315

Rozważ, że mam następujący tekst w UILabel(długiej linii tekstu dynamicznego):

Ponieważ armia obcych znacznie przewyższa liczebnie drużynę, gracze muszą wykorzystać postapokaliptyczny świat na swoją korzyść, na przykład szukając schronienia za śmietnikami, słupami, samochodami, gruzami i innymi przedmiotami.

Chcę zmienić rozmiar UILabel'swysokości, aby tekst mógł się zmieścić. Korzystam z następujących właściwości, UILabelaby utworzyć tekst do zawijania.

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

Daj mi znać, jeśli nie zmierzam w dobrym kierunku. Dzięki.

Mustafa
źródło
Zobacz także: stackoverflow.com/questions/406212/…
Richard Campbell
Szybka wersja poniżej: stackoverflow.com/a/33945342/1634890
Juan Boero

Odpowiedzi:

409

sizeWithFont constrainedToSize:lineBreakMode:jest metodą do użycia. Przykład jego użycia znajduje się poniżej:

//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;
PyjamaSam
źródło
Używa 9999, jak zrobiłbyś to elastycznie do tekstu?
quantumpotato,
1
@ quantumpotato 9999 to tylko symbol zastępczy dla maksymalnej przestrzeni, jaką może zająć tekst. Możesz użyć dowolnego numeru, który działa dla twojego interfejsu użytkownika.
PyjamaSam,
9
Jeśli zmieniasz rozmiar swoich etykiet w ten sposób, robisz to źle . Powinieneś użyć [label sizeToFit].
Marián Černý
5
Nie zapominaj, że sizeWithFontjest to przestarzałe w iOS 7. stackoverflow.com/questions/18897896/...
attomos
7
Jest przestarzałe;
msmq
242

Idziesz w dobrym kierunku. Wszystko, co musisz zrobić, to:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
DonnaLea
źródło
5
Rozmiar do dopasowania był dokładnie tym, czego potrzebowałem, aby zawinąć tekst, długi z myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble
2
O wiele łatwiejsze rozwiązanie niż odpowiedź oznaczona jako poprawna i działa równie dobrze.
memmons
4
@Inder Kumar Rathore - używam tego przez cały czas dla wielu linii, stąd liczbaOfLines = 0; Wydaje mi się, że brakuje najpierw ustawienia preferowanej szerokości, ale założyłem, że zostało to już zrobione z init UILabel.
DonnaLea,
@Donna .. Nie lubię twoich ulubionych ... czy mówisz o jego ramie?
Inder Kumar Rathore,
@DonnaLea, dziękuję bardzo. twoje proste podejście do rozwiązania pomogło mi również rozwiązać mój problem.
Nawigował
44

W systemie iOS 6 firma Apple dodała właściwość do UILabel, która znacznie upraszcza dynamiczne zmiany rozmiaru etykiet w pionie: preferowane MaxLayoutWidth .

Korzystanie z tej właściwości w połączeniu z lineBreakMode = NSLineBreakByWordWrapping i metodą sizeToFit pozwala na łatwą zmianę rozmiaru instancji UILabel do wysokości, która pomieści cały tekst.

Cytat z dokumentacji iOS:

Preferowane MaxaxayWidth Preferowana maksymalna szerokość (w punktach) dla etykiety wielowierszowej.

Dyskusja Ta właściwość wpływa na rozmiar etykiety, gdy zostaną do niej zastosowane ograniczenia układu. Jeśli podczas układania tekst wykracza poza szerokość określoną przez tę właściwość, dodatkowy tekst przepływa do jednego lub więcej nowych wierszy, zwiększając w ten sposób wysokość etykiety.

Próbka:

...
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];
...
Witalij Czałow
źródło
39

Sprawdź tę pracę idealnie bez dodawania pojedynczej linii kodu. (Korzystanie z autolayout)

Zrobiłem dla ciebie demo zgodnie z twoimi wymaganiami. Pobierz go z poniższego linku,

Autoresize UIView i UILabel

Przewodnik krok po kroku: -

Krok 1: - Ustaw ograniczenie na UIView

1) Główny 2) Top 3) Końcowy (z widoku głównego)

wprowadź opis zdjęcia tutaj

Krok 2: - Ustaw ograniczenie na etykietę 1

1) Prowadzenie 2) Top 3) Końcowe (z jego superwizji)

wprowadź opis zdjęcia tutaj

Krok 3: - Ustaw ograniczenie na etykietę 2

1) Prowadzenie 2) Końcowe (z jego podglądu)

wprowadź opis zdjęcia tutaj

Krok 4: - Najbardziej podchwytliwe jest podanie UILabel z UIView.

wprowadź opis zdjęcia tutaj

Krok 5: - (Opcjonalnie) Ustaw ograniczenie na UIButton

1) Prowadzenie 2) Dół 3) Spływ 4) Stała wysokość (z widoku głównego)

wprowadź opis zdjęcia tutaj

Wynik :-

wprowadź opis zdjęcia tutaj

Uwaga: - Upewnij się, że ustawiłeś Liczba linii = 0 we właściwości Label.

wprowadź opis zdjęcia tutaj

Mam nadzieję, że te informacje wystarczą, aby zrozumieć funkcję Uoresview z funkcją Autoresize zgodnie z wysokością UILabel i UILabel z funkcją Autoresize według tekstu.

Badal Shah
źródło
A co, jeśli chcesz mieć także niektóre widoki w widoku białego tła? Nie podanie wysokości spowoduje wyświetlenie niektórych czerwonych linii w SB dla „Potrzeba ograniczeń dla: pozycji Y lub wysokości”
Bogdan Razvan
należy to zaznaczyć jako prawidłową odpowiedź. To jest właściwa droga z ib.
Rana Tallal
@ SPQR3 w czym problem? pomogło wielu ludziom i działa dobrze.
Badal Shah
36

Zamiast robić to programowo, możesz to zrobić w Storyboard / XIB podczas projektowania.

  • Ustawianie UILabel za liczbę linii własności do 0 w atrybucie inspektora.
  • Następnie ustaw ograniczenie szerokości / (lub) ograniczenie wiodące i końcowe zgodnie z wymaganiami.
  • Następnie ustawić wysokość ograniczenie z wartości minimalnej . Na koniec wybierz dodane ograniczenie wysokości, a następnie w inspektorze rozmiarów obok atrybutu inspektora zmień relację ograniczenia wysokości z równego na - większy niż .
Pavithra Duraisamy
źródło
Ten działa dla UILabel osadzonego w niestandardowej komórce xib w UITableView.
Gang Fang,
Zgodnie z odpowiedzią ustawiłem stałą wysokość mojej etykiety i ustawiłem priorytet na Niski (250), a błędy znikają. (Nie trzeba ustawiać równej - większej niż)
Hamid Reza Ansari
15

Dzięki chłopaki za pomoc, oto kod, który wypróbowałem i który działa dla mnie

   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];
iappdeveloper
źródło
2
sizeWithFont jest przestarzały.
msmq
12

Rozwiązanie dla iOS7 wcześniejszego i iOS7 powyżej

//
//  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
Vijay-Apple-Dev.blogspot.com
źródło
Gdzie w podklasie UITableViewController mam wywoływać tę metodę?
Homam
Tam, gdzie chcesz obliczyć wysokość etykiety, wywołaj tę metodę. następnie dostosuj wysokość widoku tabeli. gdzie masz wysokość widoku tabeli dla metody wiersza przy indeksie. obliczyć wszystkie tekstowe etykiety pionowe według potrzeb
Vijay-Apple-Dev.blogspot.com
Vijay sizeWithFont jest osłabiony.
user3182143
10

Ponieważ sizeWithFont jest przestarzałe, używam go zamiast tego.

ten otrzymuje atrybuty specyficzne dla etykiety.

-(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);
}
pkarc
źródło
6

Oto wersja kategorii:

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
brame
źródło
6

Możesz zaimplementować TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath metodę w następujący sposób (na przykład):

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

Również użyć NSString„s sizeWithFont:constrainedToSize:lineBreakMode:metody, aby obliczyć wysokość tekstu jest.

klefevre
źródło
6

Rozszerzenie UILabel oparte na tej odpowiedzi dla Swift 4 i nowszych

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

}

Może być używany jak:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
Politycznie niezależny
źródło
4

A dla tych, którzy migrują do iOS 8, oto rozszerzenie klasy dla 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)
        }
    }

}
Paul Ardeleanu
źródło
4

Najłatwiejszym i lepszym sposobem, który działał dla mnie, było zastosowanie ograniczenia wysokości do etykiety i ustawienie priorytetu na niski , tj. (250) w serii ujęć.

Więc nie musisz się martwić o programowe obliczanie wysokości i szerokości dzięki scenorysowi.

Akshay K.
źródło
4

Moje podejście do obliczania dynamicznej wysokości 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

Zawiń do funkcji:

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
}
AechoLiu
źródło
3

Zaktualizowana metoda

+ (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;
}
Sandeep Singh
źródło
3

To jest jeden wiersz kodu, aby uzyskać wysokość UILabel za pomocą Objective-c:

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

i używając .height otrzymasz wysokość etykiety w następujący sposób:

neededSize.height
Sagar Sukode
źródło
Najlepsza aktualna odpowiedź.
Mike
3

Możesz uzyskać wysokość, używając poniższego kodu

Musisz zdać

  1. tekst 2. czcionka 3. szerokość etykiety

    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
    }
Rohit Makwana
źródło
2

Dzięki za ten post. Bardzo mi pomogło. W moim przypadku edytuję również tekst w osobnym kontrolerze widoku. Zauważyłem, że kiedy używam:

[cell.contentView addSubview:cellLabel];

w tableView: cellForRowAtIndexPath: metoda polegająca na tym, że widok etykiety był stale renderowany w górnej części poprzedniego widoku za każdym razem, gdy edytowałem komórkę. Tekst został podzielony na piksele, a gdy coś zostało usunięte lub zmienione, poprzednia wersja była widoczna w nowej wersji. Oto jak rozwiązałem problem:

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

Nigdy więcej dziwnych warstw. Jeśli istnieje lepszy sposób na poradzenie sobie z tym, proszę dać mi znać.

Tim Stephenson
źródło
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];

użyj tego tutaj wszystkie właściwości są używane na etykiecie i przetestuj go, zwiększając tekst w itemTitle.text as

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

pokaże odpowiedź perfetc, jak potrzebujesz

Ashokdy
źródło
2

Możesz również użyć go jako metody. @Pyjamasam jest bardzo prawdziwe, więc właśnie tworzę tę metodę. Może być pomocny dla kogoś innego

-(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 po prostu ustaw to w ten sposób

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
Meszadi
źródło
2

Aby to zrobić w Swift3, następujący kod:

 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)
Baxter
źródło
2

Dodanie do powyższych odpowiedzi:

Można to łatwo osiągnąć za pomocą scenorysu.

  1. Ustaw ograniczenie dla UILabel. (W moim przypadku zrobiłem górną, lewą i stałą szerokość)
  2. Ustaw liczbę linii na 0 w Inspektorze atrybutów
  3. Ustaw podział linii na WordWrap w Inspektorze atrybutów.

Regulacja wysokości UILabel

chetan
źródło
1

Jedna linia mówi, że odpowiedź Chrisa jest błędna.

newFrame.size.height = maximumLabelSize.height;

Powinien być

newFrame.size.height = expectedLabelSize.height;

Poza tym jest to prawidłowe rozwiązanie.

David Weiss
źródło
1

Wreszcie zadziałało. Dzięki chłopaki.

Nie działałem, ponieważ próbowałem zmienić rozmiar etykiety w heightForRowAtIndexPathmetodzie:

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

i (tak głupie ja) zmieniłem rozmiar etykiety na domyślną w cellForRowAtIndexPathmetodzie - przeoczyłem kod, który napisałem wcześniej:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Mustafa
źródło
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;    
}
Frank Fu
źródło
2
Czy możesz dodać wyjaśnienie, w jaki sposób Twoje rozwiązanie rozwiązuje problem PO?
1
nie możesz zapytać UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; in heightForRowAtIndexPath, przełączysz się na nieskończoną pętlę
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];
Gaurav Gilani
źródło
1

Mój kod:

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);
PhuocLuong
źródło
1

Ta metoda da idealną wysokość

-(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;
}
Prashant Tukadiya
źródło
Nie kopiuj treści skądinąd bez wyraźnego przypisania. Jest to postrzegane jako plagiat. Zobacz 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()

Interesujące linie są sizeToFit()w połączeniu z ustawieniem frame.size.heightna maksimum float, da to miejsce na długi tekst, ale sizeToFit()zmusi go do używania tylko niezbędnych, ale ZAWSZE wywołuje go po ustawieniu.frame.size.height .

Zalecam ustawienie .backgroundColordla celów debugowania, w ten sposób można wyświetlić ramkę renderowaną dla każdej sprawy.

Juan Boero
źródło
1
yourLabel.frame.heightto nieruchomość typu get only
Phil Hudson
2
yourLabel.frame.size.width i yourLabel.frame.size.height są również tylko do odczytu
CalZone
1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Ustaw ograniczenia dla UILable w serii ujęć, w tym u góry po lewej u dołu po prawej

Anargit garg
źródło