UILabel - label ukuran otomatis agar sesuai dengan teks?

144

Apakah mungkin untuk secara otomatis mengubah ukuran kotak / batas UIL agar sesuai dengan teks yang terkandung? (Saya tidak peduli jika ujungnya lebih besar dari tampilan)

Jadi, jika pengguna memasukkan "halo" atau "nama saya sangat panjang, saya ingin masuk ke dalam kotak ini", tidak pernah terpotong dan labelnya 'diperlebar' sesuai?

wayneh
sumber
Siapa pun tolong bantu saya dengan memberikan kode cepat ..
Angel F Syrus

Jawaban:

98

Silakan periksa inti saya di mana saya telah membuat kategori UILabeluntuk sesuatu yang sangat mirip, kategori saya memungkinkan UILabelperegangan itu tinggi untuk menampilkan semua konten: https://gist.github.com/1005520

Atau lihat pos ini: https://stackoverflow.com/a/7242981/662605

Ini akan meregangkan ketinggian, tetapi Anda dapat mengubahnya dengan mudah untuk bekerja dengan cara lain dan meregangkan lebar dengan sesuatu seperti ini, yang saya percaya apa yang ingin Anda lakukan:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

Anda bisa lebih mudah menggunakan sizeToFitmetode yang tersedia dari UIViewkelas, tetapi atur jumlah baris menjadi 1 agar aman.


Pembaruan iOS 6

Jika Anda menggunakan AutoLayout, maka Anda memiliki solusi bawaan. Dengan mengatur jumlah baris ke 0, kerangka kerja akan mengubah ukuran label Anda dengan tepat (menambahkan lebih banyak tinggi) agar sesuai dengan teks Anda.


Pembaruan iOS 8

sizeWithFont:sudah usang jadi gunakan sizeWithAttributes:saja:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}
Daniel
sumber
8
Dengan menggunakan metode AutoLayout iOS 6, saya berakhir dengan batasan ketinggian pada label yang tidak dapat saya singkirkan. Mengatur Relasi batasan ketinggian ke 'Lebih Besar atau Setara' memungkinkan tinggi untuk tumbuh.
Michael Luton
2
sizeWithFont: constrainedToSize: lineBreakMode: method depricated in ios 7
Karan Alangat
1
UILabel tidak mengubah ukuran sendiri ketika teks kurang / lebih. saya menggunakan tata letak otomatis. Sudah Mencoba Membuat UILabel tetapi mereka dibuat setiap kali cellForRowAtIndex diinisialisasi. Mencoba banyak hal. Tidak ada yang berhasil untuk saya. Latar belakang uilabel mengambil lebar yang sama. Tolong !!!
coreDeviOS
@Aniel Saya mengatur jumlah baris = 0, tetapi tidak berfungsi. Saya telah menetapkan batasan pusat horizontal dan vertikal. Satu hal tambahan yang saya lakukan adalah membuat subclass dari UILABEL dan menggunakannya untuk Label itu
Jasmeet
Dengan Autolayout solusi paling sederhana untuk: (1) Atur Lines ke 0, (2) Tetapkan batasan lebar menjadi "Greater Than or Equal" dengan Constant 0, (3) Tetapkan batasan ketinggian menjadi "Greater Than atau Equal" dengan Constant 0, ( 4) Sejajarkan seperti biasanya, misalnya dengan memusatkan secara horizontal dan vertikal.
Erik van der Neut
76

Menggunakan [label sizeToFit]; akan mencapai hasil yang sama dari Kategori Daniels.

Meskipun saya sarankan untuk menggunakan autolayout dan biarkan label mengubah ukurannya sendiri berdasarkan kendala.

Guilherme Torres Castro
sumber
3
Saat menggunakan swift, saya harus menjalankan ini pada utas utama menggunakan dispatch_async (dispatch_get_main_queue (), {});
Zeezer
@ Zeezer, tahukah Anda mengapa?
FurloSK
13
@FurloSK Setiap perubahan pada ui harus dilakukan di utas utama.
Guilherme Torres Castro
32

Jika kita ingin yang UILabelmenyusut dan berkembang berdasarkan ukuran teks maka storyboard dengan autolayout adalah pilihan terbaik. Di bawah ini adalah langkah-langkah untuk mencapai ini

Langkah

  1. Letakkan UILabel di view controller dan letakkan di mana pun Anda inginkan. Juga menempatkan 0untuk numberOfLinesproperti UILabel.

  2. Berikan batasan pin space Top, Leading, dan Trailing.

masukkan deskripsi gambar di sini

  1. Sekarang akan memberi peringatan, Klik pada panah kuning.

masukkan deskripsi gambar di sini

  1. Klik Update Framedan klik Fix Misplacement. Sekarang, UILabel ini akan menyusut jika teks kurang dan berkembang jika teks lebih banyak.
Yogesh Suthar
sumber
1
Saya belum menguji lokalisasi, tetapi seharusnya bisa juga.
Yogesh Suthar
2
Saya tidak bisa menjalankan ini dengan proyek yang ada sampai saya menghapus centang pada kotak "" Lebar yang dipilih "" Eksplisit ", maka semuanya bekerja dengan baik.
zorro2b
25

Ini tidak serumit beberapa jawaban lainnya.

masukkan deskripsi gambar di sini

Sematkan tepi kiri dan atas

Cukup gunakan tata letak otomatis untuk menambahkan batasan untuk menyematkan sisi kiri dan atas label.

masukkan deskripsi gambar di sini

Setelah itu akan secara otomatis mengubah ukuran.

Catatan

  • Jangan tambahkan kendala untuk lebar dan tinggi. Label memiliki ukuran intrinsik berdasarkan konten teksnya.
  • Terima kasih atas jawaban ini untuk bantuannya.
  • Tidak perlu diatur sizeToFitsaat menggunakan tata letak otomatis. Kode lengkap saya untuk proyek contoh ada di sini:

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
  • Jika Anda ingin label Anda membungkus baris maka atur jumlah baris ke 0 dalam IB dan tambahkan myLabel.preferredMaxLayoutWidth = 150 // or whateverkode. (Saya juga menyematkan tombol saya ke bagian bawah label sehingga akan bergerak turun ketika ketinggian label meningkat.)

masukkan deskripsi gambar di sini

  • Jika Anda mencari label ukuran secara dinamis di dalam a UITableViewCellmaka lihat jawaban ini .

masukkan deskripsi gambar di sini

Suragch
sumber
Hai, saya mendapat label ukurannya tetapi saya tidak mengerti bagaimana mengubah ukuran tinggi sel. Bisakah Anda memberi tahu saya cara mengubah ukuran tinggi sel.
Vivek
@Vivek, selama Anda tidak memiliki batasan yang ditetapkan pada ketinggian, itu harus secara otomatis mengubah ukuran.
Suragch
Ya, Tapi Bagaimana Mungkin saat saya menggunakan sel khusus dan saya menaruh 2 label di selnya.
Vivek
@Vivek, maaf, saya salah membaca pertanyaan Anda. Apakah Anda sudah mendapatkan satu label untuk bekerja dengan membaca jawaban ini ?
Suragch
9

Gunakan [label sizeToFit];untuk menyesuaikan teks dalam UILabel

Gaurav Gilani
sumber
5

Saya membuat beberapa metode berdasarkan jawaban Daniel di atas.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}
Doug Baker
sumber
5

Inilah yang saya temukan bekerja untuk situasi saya:

1) Tinggi UILabel memiliki batasan> = 0 menggunakan autolayout. Lebar diperbaiki. 2) Tetapkan teks ke dalam UILabel, yang sudah memiliki superview pada saat itu (tidak yakin seberapa vital itu). 3) Lalu, lakukan:

    label.sizeToFit()
    label.layoutIfNeeded()

Tinggi label sekarang diatur dengan tepat.

Chris Prince
sumber
3
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

Ini adalah metode kategori. Anda harus mengatur teks terlebih dahulu, daripada memanggil metode ini untuk menyesuaikan ketinggian UILabel.

Kaijay Lu
sumber
2

Anda dapat mengukur label Anda sesuai dengan teks dan kontrol terkait lainnya menggunakan dua cara-

  1. Untuk iOS 7.0 ke atas

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;

sebelum iOS 7.0 ini dapat digunakan untuk menghitung ukuran label

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// membingkai ulang kontrol lain berdasarkan labelTextHeight

CGFloat labelTextHeight = labelTextSize.height;
  1. Jika Anda tidak ingin menghitung ukuran teks label daripada Anda dapat menggunakan -sizeToFit pada contoh UILabel as-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text

// setelah ini Anda bisa mendapatkan bingkai label untuk membingkai ulang kontrol terkait lainnya

vijeesh
sumber
2
  1. Tambahkan kendala yang hilang di storyboard.
  2. Pilih UILabel di storyboard dan atur atribut "Line" ke 0.
  3. Ref Outlet UILabel ke Controller.h dengan label id:
  4. Controller.m dan tambahkan [label sizeToFit];viewDidLoad
pengguna2941395
sumber
1

Saya memiliki masalah besar dengan tata letak otomatis. Kami memiliki dua wadah di dalam sel tabel. Wadah kedua ukurannya tergantung pada deskripsi Item (0 - 1000 karakter), dan baris harus diubah ukurannya berdasarkan itu.

Bahan yang hilang adalah kendala dasar untuk deskripsi.

Saya telah mengubah batasan bawah elemen dinamis dari = 0 ke > = 0 .

Bojan Tadic
sumber
Ini menyelamatkan hidupku. Jika Anda mencoba mengikuti: github.com/honghaoz/… ini adalah jawaban yang benar.
Justin Fyles
0

Cocok setiap saat! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];
HannahCarney
sumber
0

Anda dapat menampilkan satu output garis kemudian mengatur properti Line = 0 dan menunjukkan beberapa output baris kemudian mengatur properti Line = 1 dan lebih banyak

[self.yourLableName sizeToFit];
Dixit Akabari
sumber
-1

Ada juga pendekatan ini:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];
Dave Cole
sumber
Bukan saya yang menurunkan jawaban ini tetapi saya hanya ingin menunjukkan bahwa saya tidak dapat melihat changeTextWithAutoHeight:width:metode UILabel. Bisakah Anda memberikan tautan ke tempat dalam dokumentasi UIKit metode ini dapat ditemukan.
Adil Hussain