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?

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

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


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 

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.


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


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

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;

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 !!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.