Sesuaikan ketinggian UILabel tergantung pada teks

315

Pertimbangkan saya memiliki teks berikut dalam UILabel(garis panjang teks dinamis):

Karena pasukan alien jauh melebihi jumlah tim, pemain harus menggunakan dunia pasca-apokaliptik untuk keuntungan mereka, seperti mencari perlindungan di balik tempat sampah, pilar, mobil, puing, dan benda lainnya.

Saya ingin mengubah ukuran UILabel'sketinggian sehingga teks dapat masuk. Saya menggunakan properti berikut UILabeluntuk membuat teks di dalam untuk membungkus.

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

Tolong beri tahu saya jika saya tidak menuju ke arah yang benar. Terima kasih.

Mustafa
sumber
Lihat juga: stackoverflow.com/questions/406212/…
Richard Campbell
Versi cepat di bawah: stackoverflow.com/a/33945342/1634890
Juan Boero

Jawaban:

409

sizeWithFont constrainedToSize:lineBreakMode:adalah metode yang digunakan. Contoh cara menggunakannya adalah di bawah ini:

//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
sumber
Ini menggunakan 9999, bagaimana Anda melakukannya fleksibel terhadap teks?
quantumpotato
1
@quantumpotato 9999 hanyalah tempat penampung untuk ruang maksimum teks diizinkan untuk mengambil. Anda dapat menggunakan nomor apa pun yang berfungsi untuk UI Anda.
PyjamaSam
9
Jika Anda mengukur label Anda seperti ini, Anda salah melakukannya . Anda harus menggunakan [label sizeToFit].
Marián Černý
5
Jangan lupa bahwa sizeWithFontitu sudah usang di iOS 7. stackoverflow.com/questions/18897896/…
attomos
7
Ini sudah usang;
msmq
242

Anda pergi ke arah yang benar. Yang perlu Anda lakukan adalah:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
DonnaLea
sumber
5
Ukuran yang pas adalah apa yang saya butuhkan untuk membungkus teks, panjang dengan myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble
2
Solusi yang jauh lebih mudah daripada jawaban yang ditandai sebagai benar dan berfungsi dengan baik.
memmons
4
@Inder Kumar Rathore - Saya menggunakan ini untuk beberapa baris, sepanjang waktu, karenanya numberOfLines = 0; Saya kira itu hilang pengaturan lebar yang dipilih pertama, tapi saya berasumsi bahwa sudah dilakukan dengan init dari UILabel.
DonnaLea
@Donna .. Aku tidak mendapatkan pilihanmu .. apa kau berbicara tentang bingkainya ??
Inder Kumar Rathore
@DonnaLea, Terima kasih banyak. pendekatan sederhana Anda terhadap solusi membantu saya untuk menyelesaikan masalah saya juga.
Naved
44

Di iOS 6 Apple telah menambahkan properti ke UILabel yang sangat menyederhanakan ukuran vertikal dinamis label: preferMaxLayoutWidth .

Menggunakan properti ini dalam kombinasi dengan lineBreakMode = NSLineBreakByWordWrapping dan metode sizeToFit memungkinkan dengan mudah mengubah ukuran instance UILabel ke ketinggian yang mengakomodasi seluruh teks.

Kutipan dari dokumentasi iOS:

preferMaxLayoutWidth Lebar maksimum yang disukai (dalam poin) untuk label multiline.

Diskusi Properti ini mempengaruhi ukuran label ketika batasan tata letak diterapkan untuk itu. Selama tata letak, jika teks melampaui lebar yang ditentukan oleh properti ini, teks tambahan dialirkan ke satu atau lebih baris baru, sehingga meningkatkan ketinggian label.

Sebuah sampel:

...
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];
...
Vitali Tchalov
sumber
39

Periksa pekerjaan ini dengan sempurna tanpa menambahkan satu baris kode. (Menggunakan Autolayout)

Saya membuat demo untuk Anda sesuai dengan kebutuhan Anda. Unduh dari tautan di bawah ini,

Autoresize UIView dan UILabel

Panduan langkah demi langkah: -

Langkah 1: - Tetapkan batasan untuk UIView

1) Leading 2) Top 3) Trailing (Dari mainview)

masukkan deskripsi gambar di sini

Langkah 2: - Tetapkan batasan ke Label 1

1) Leading 2) Top 3) Trailing (Dari itu superview)

masukkan deskripsi gambar di sini

Langkah 3: - Tetapkan constrain ke Label 2

1) Leading 2) Trailing (Dari superview-nya)

masukkan deskripsi gambar di sini

Langkah 4: - Beri botton paling rumit ke UILabel dari UIView.

masukkan deskripsi gambar di sini

Langkah 5: - (Opsional) Tetapkan batasan ke UIButton

1) Memimpin 2) Bawah 3) Membuntuti 4) Tinggi Tetap (Dari mainview)

masukkan deskripsi gambar di sini

Output: -

masukkan deskripsi gambar di sini

Catatan: - Pastikan Anda telah menetapkan Jumlah baris = 0 pada properti Label.

masukkan deskripsi gambar di sini

Saya harap info ini cukup untuk memahami Autoresize UIView menurut tinggi UILabel dan Autoresize UILabel Menurut teks.

Badal Shah
sumber
Dan bagaimana jika Anda ingin memiliki beberapa tampilan di bawah tampilan latar belakang putih? Tidak memberikan ketinggian akan menunjukkan beberapa garis merah di SB untuk "Perlu kendala untuk: Posisi atau tinggi Y"
Bogdan Razvan
ini perlu ditandai sebagai jawaban yang benar. Ini adalah cara yang benar dengan ib.
Rana Tallal
@ SPQR3 apa masalahnya? itu membantu banyak orang dan berfungsi dengan baik.
Badal Shah
36

Alih-alih melakukan ini secara terprogram, Anda bisa melakukan ini di Storyboard / XIB saat mendesain.

  • Setel properti baris UIlabel ke 0 di pemeriksa atribut.
  • Kemudian atur batasan lebar / (atau) batasan depan dan belakang sesuai kebutuhan.
  • Kemudian atur batasan ketinggian dengan nilai minimum . Akhirnya pilih batasan ketinggian yang Anda tambahkan dan pada inspektur ukuran yang di sebelah inspektur atribut, ubah relasi batasan ketinggian dari sama dengan - lebih besar dari .
Pavithra Duraisamy
sumber
Ini berfungsi untuk UILabel yang disematkan dalam sel xib khusus di UITableView.
Gang Fang
Menurut jawaban Anda, saya menetapkan tinggi konstan untuk label saya dan menetapkan prioritas ke Rendah (250) dan kesalahan hilang. (Tidak perlu sama dengan - lebih besar dari)
Hamid Reza Ansari
15

Terima kasih kawan untuk bantuan, ini kode yang saya coba yang berfungsi untuk saya

   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
sumber
2
sizeWithFont sudah usang.
msmq
12

Solusi untuk iOS7 sebelumnya dan iOS7 di atas

//
//  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
sumber
Dalam subkelas UITableViewController, di mana saya harus memanggil metode ini?
Homam
Di mana Anda ingin menghitung tinggi label kemudian panggil metode ini. kemudian sesuaikan ketinggian tampilan tabel. di mana Anda memiliki tinggi tampilan tabel untuk baris pada metode indeks. hitung semua label teks vertikal sesuai kebutuhan
Vijay-Apple-Dev.blogspot.com
Ukuran Vijay tidak tersedia.
user3182143
10

Karena sizeWithFont sudah usang saya menggunakan yang ini sebagai gantinya.

ini mendapatkan atribut label khusus.

-(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
sumber
6

Ini adalah versi kategori:

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
bbrame
sumber
6

Anda dapat menerapkan TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath metode dengan cara berikut (misalnya):

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

Juga menggunakan NSString's sizeWithFont:constrainedToSize:lineBreakMode:metode untuk menghitung ketinggian teks.

klefevre
sumber
6

Ekstensi UILabel berdasarkan jawaban ini untuk Swift 4 dan di atasnya

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

}

Dapat digunakan seperti:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
Maverick
sumber
4

Dan bagi mereka yang bermigrasi ke iOS 8, berikut adalah ekstensi kelas untuk 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
sumber
4

Cara termudah dan lebih baik yang berhasil bagi saya adalah menerapkan batasan ketinggian pada label dan menetapkan prioritas ke rendah , yaitu (250) di storyboard.

Jadi Anda tidak perlu khawatir tentang menghitung tinggi dan lebar secara pemrograman, berkat storyboard.

Akshay K
sumber
4

Pendekatan saya untuk menghitung ketinggian dinamis 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

Bungkus berfungsi:

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
sumber
3

Metode yang Diperbarui

+ (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
sumber
3

Ini adalah satu baris kode untuk mendapatkan Tinggi UILabel menggunakan Objective-c:

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

dan menggunakan. tinggi Anda akan mendapatkan ketinggian label sebagai berikut:

neededSize.height
Sagar Sukode
sumber
Jawaban terbaik saat ini.
Mike
3

Anda bisa mendapatkan tinggi menggunakan kode di bawah ini

Anda harus lulus

  1. teks 2. font 3. lebar label

    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
sumber
2

Terima kasih untuk posting ini. Itu sangat membantu saya. Dalam kasus saya, saya juga mengedit teks dalam controller tampilan terpisah. Saya perhatikan bahwa ketika saya menggunakan:

[cell.contentView addSubview:cellLabel];

di tableView: cellForRowAtIndexPath: metode yang tampilan label terus diberikan di atas tampilan sebelumnya setiap kali saya mengedit sel. Teks menjadi pixelated, dan ketika sesuatu dihapus atau diubah, versi sebelumnya terlihat di bawah versi baru. Inilah cara saya memecahkan masalah:

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

Tidak ada lagi lapisan aneh. Jika ada cara yang lebih baik untuk menangani ini, Tolong beri tahu saya.

Tim Stephenson
sumber
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];

gunakan ini di sini semua properti digunakan pada label dan mengujinya dengan meningkatkan teks dalam itemTitle.text sebagai

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

itu akan menampilkan jawaban perfetc yang Anda butuhkan

asbak
sumber
2

Anda dapat menggunakannya sebagai metode juga. @ Pyjamasam sangat benar jadi saya hanya membuat metodenya. Mungkin bermanfaat bagi orang lain

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

dan atur seperti ini

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

Untuk melakukan ini di Swift3, berikut ini adalah kode:

 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
sumber
2

Menambahkan ke jawaban di atas:

Ini dapat dengan mudah dicapai melalui storyboard.

  1. Tetapkan batasan untuk UILabel. (Dalam kasus saya, saya melakukan lebar atas, kiri dan tetap)
  2. Tetapkan Jumlah baris ke 0 di Atribut Inspektur
  3. Setel Line Break ke WordWrap di Attribute Inspector.

Penyesuaian Tinggi UILabel

chetan
sumber
1

Satu baris adalah jawaban Chris salah.

newFrame.size.height = maximumLabelSize.height;

seharusnya

newFrame.size.height = expectedLabelSize.height;

Selain itu, itu solusi yang tepat.

David Weiss
sumber
1

Akhirnya berhasil. Terima kasih kawan.

Saya tidak membuatnya berfungsi karena saya mencoba mengubah ukuran label pada heightForRowAtIndexPathmetode:

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

dan (yeah konyol saya), saya mengubah ukuran label ke default di cellForRowAtIndexPath metode - saya mengabaikan kode yang saya tulis sebelumnya:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Mustafa
sumber
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
sumber
2
Bisakah Anda menambahkan beberapa penjelasan tentang bagaimana solusi Anda memecahkan masalah OP?
1
Anda tidak dapat meminta UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; di heightForRowAtIndexPath, Anda akan menemukan dan loop tak terbatas
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
sumber
1

Kode saya:

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
sumber
1

Metode ini akan memberikan tinggi sempurna

-(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
sumber
Jangan menyalin konten dari tempat lain tanpa atribusi yang jelas. Itu dilihat sebagai plagiarisme. Lihat 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()

Garis yang menarik adalah sizeToFit()bersamaan dengan pengaturan a frame.size.heightke max float, ini akan memberikan ruang untuk teks yang panjang, tetapi sizeToFit()akan memaksanya untuk hanya menggunakan yang diperlukan, tetapi SELALU memanggilnya setelah mengatur .frame.size.height.

Saya merekomendasikan pengaturan .backgroundColoruntuk keperluan debug, dengan cara ini Anda dapat melihat bingkai yang diberikan untuk setiap kasus.

Juan Boero
sumber
1
yourLabel.frame.heightadalah properti hanya mendapatkan
Phil Hudson
2
yourLabel.frame.size.width dan yourLabel.frame.size.height hanya dapat dibaca
CalZone
1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Silakan tentukan batasan untuk UILable di storyboard termasuk kanan kiri atas

Ankit garg
sumber