Bagaimana cara menghitung lebar UILabel berdasarkan panjang teks?

142

Saya ingin menampilkan gambar di sebelah UILabel, namun UILabel memiliki panjang teks variabel, jadi saya tidak tahu di mana harus menempatkan gambar. Bagaimana saya bisa mencapai ini?

Sheehan Alam
sumber

Jawaban:

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

Apa itu - [NSString sizeWithFont: forWidth: lineBreakMode:] bagus untuk?

pertanyaan ini mungkin punya jawaban Anda, itu berhasil untuk saya.


Untuk 2014, saya mengedit dalam versi baru ini, berdasarkan komentar ultra-praktis oleh Norbert di bawah ini! Ini melakukan segalanya. Bersulang

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);
Aaron Saunders
sumber
41
Hanya sebuah catatan: ini sudah usang sejak iOS7. Cara yang disukai sekarang adalah:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert
17
Anda juga dapat menggunakan properti IntrinsicContentSize. Saya tidak banyak ke Objective-c, tetapi harus seperti ini: self.yourLabel.intrinsicContentSize Ini akan memberi Anda ukuran konten label, sehingga Anda bisa mendapatkan lebar dari sana.
Boris
1
Cukup yourLabel.intrinsicContentSize.widthbagus, periksa jawaban di bawah ini.
denis_lor
155

yourLabel.intrinsicContentSize.widthuntuk Objective-C / Swift

Jakub Truhlář
sumber
tidak bekerja untuk saya, itu tidak menghitung tinggi lebar label berdasarkan teks mereka
Chandni
1
Bekerja dengan baik untuk saya, dengan font khusus juga!
fl034
1
jawaban sempurna untuk mendapatkan lebar label dinamis
Chetan
52

Dengan cepat

 yourLabel.intrinsicContentSize().width 
Arshad
sumber
3
Jawaban ini hanya valid untuk tampilan yang telah diletakkan
rommex
33

Jawaban yang dipilih benar untuk iOS 6 dan di bawah.

Di iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:sudah usang . Sekarang disarankan Anda menggunakan boundingRectWithSize:options:attributes:context:.

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

Perhatikan bahwa nilai kembali CGRectbukan a CGSize. Semoga itu akan menjadi bantuan bagi orang yang menggunakannya di iOS 7.

Chetan Shenoy
sumber
12

Di iOS8 sizeWithFont telah ditinggalkan, lihat

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

Anda bisa menambahkan semua atribut yang Anda inginkan di sizeWithAttributes. Atribut lain yang dapat Anda atur:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

dan seterusnya. Tapi mungkin Anda tidak akan membutuhkan yang lain

jarora
sumber
10

Swift 4 Jawab yang menggunakan Kendala

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

Swift 5 Jawab yang menggunakan Kendala

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
iOS Lifee
sumber
1
Bagus! Nyaman untuk menghitung lebar UIButton menurut teks, di mana intrinsicContentSize.width tidak selalu berfungsi dengan benar.
nomnom
8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Sayang Lakhani
sumber
2
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari seorang penulis, tinggalkan komentar di bawah posting mereka - Anda selalu dapat mengomentari posting Anda sendiri, dan begitu Anda memiliki reputasi yang cukup, Anda akan dapat mengomentari setiap posting .
The Humble Rat
jawaban ini memberi tahu cara menyesuaikan ukuran label menurut teks. apa masalahnya dalam hal ini?
Honey Lakhani
2

Inilah sesuatu yang saya buat setelah menerapkan beberapa prinsip posting SO lainnya, termasuk tautan Aaron:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

Dalam contoh ini, saya menambahkan pin khusus ke kelas MKAnnotation yang mengubah ukuran UILabel sesuai dengan ukuran teks. Ini juga menambahkan gambar di sisi kiri tampilan, sehingga Anda melihat beberapa kode mengelola spasi yang tepat untuk menangani gambar dan bantalan.

Kuncinya adalah menggunakan CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];dan kemudian mendefinisikan kembali dimensi tampilan. Anda dapat menerapkan logika ini untuk tampilan apa pun.

Meskipun jawaban Harun bekerja untuk beberapa orang, itu tidak berhasil untuk saya. Ini adalah penjelasan yang jauh lebih terperinci yang harus Anda coba segera sebelum pergi ke tempat lain jika Anda ingin tampilan yang lebih dinamis dengan gambar dan UILabel yang dapat diubah ukurannya. Saya sudah melakukan semua pekerjaan untuk Anda !!

whyoz
sumber