Beberapa baris teks dalam UILabel

443

Apakah ada cara untuk memiliki beberapa baris teks UILabelseperti di UITextViewatau haruskah saya menggunakan yang kedua?

Ilya Suzdalnitski
sumber
5
Catatan yang UILineBreakModeWordWrapsudah usang di iOS 6. Anda sekarang harus menggunakan NSLineBreakByWordWrapping = 0Lihat dokumentasi di sini
Austin
periksa Pertanyaan ini stackoverflow.com/questions/2312899/…
user1766342

Jawaban:

796

Saya menemukan solusinya.

Kita hanya perlu menambahkan kode berikut:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

Pulihkan jawaban lama (untuk referensi dan pengembang yang bersedia mendukung iOS di bawah 6.0):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Di sisi: kedua nilai enum menghasilkan to 0anyway.

Ilya Suzdalnitski
sumber
16
UILineBreakModeWordWrap sebenarnya adalah default sehingga Anda tidak perlu baris pertama.
Jarred Olson
1
Bagi yang menggunakan swift: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingdancell.textLabel?.numberOfLines = 0
boidkan
5
Terima kasih telah menyediakan Xamarin-Code. Pelengkapan otomatis tidak berfungsi karena mereka memilih untuk menyingkat properti itu ... +1
Jan Gillich
Saya setuju dengan Jarred Olson, NSLineBreakByWordWrapping adalah default . Saya menambahkan sizeToFit properti seperti panduan Gurumoorthy Arumugam untuk memperbaikinya. Jika Anda ingin font di dalam label Anda menyesuaikan diri agar sesuai dengan batas-batas label. Anda dapat menggunakan: textLabel.adjustsFontSizeToFitWidth = YA; Terima kasih semuanya.
ryan tran
@JarredOlson Docs mengatakan "Properti ini diatur ke byTruncatingTail secara default."
Bill
138

Di IB, setel jumlah baris ke 0 (memungkinkan jalur tak terbatas)

Saat mengetik dalam bidang teks menggunakan IB, gunakan "alt-return" untuk menyisipkan pengembalian dan pergi ke baris berikutnya (atau Anda dapat menyalin dalam teks yang sudah dipisahkan oleh baris).

Kendall Helmstetter Gelner
sumber
1
[Saat ia dengan sadar menggali utas yang lebih dari satu tahun ...] Satu hal yang kadang-kadang saya harapkan bisa saya lakukan di IB adalah memasukkan teks tanpa jeda baris yang disematkan, atur UILineBreakModeWordWrap dan numberOfLines = 0, dan kemudian minta label otomatis -ukuran tinggi secara otomatis, sementara itu masih merancang di IB. Saya sedang memikirkan kasus di mana tampilan diubah ukurannya menjadi lanskap, di mana garis putus pada label mungkin bermasalah. Atau ... Saya bisa menyalahgunakan IB! Mungkin memiliki label ukuran-otomatis dalam IB menyebabkan lebih banyak masalah daripada memecahkannya? (Juga, Anda tidak bisa menggunakan sizeToFit pada titik ini.)
Joe D'Andrea
Hal "0" yang saya dapatkan dari dokumen untuk UILabel, alt-return dari seorang teman yang telah menggunakan Interface Builder selama bertahun-tahun.
Kendall Helmstetter Gelner
3
+1 untuk menjadi satu-satunya jawaban yang menyebutkan "alt-return". Secara khusus "ctrl-return" sepertinya akan berfungsi tetapi tidak.
paulmelnikow
52

Solusi terbaik yang saya temukan (untuk masalah frustasi yang seharusnya diselesaikan dalam kerangka kerja) mirip dengan vaychick.

Cukup atur jumlah baris ke 0 dalam IB atau kode

myLabel.numberOfLines = 0;

Ini akan menampilkan garis-garis yang diperlukan tetapi akan memposisikan ulang label sehingga bagian tengahnya horizontal (sehingga label 1 baris dan 3 baris sejajar dalam posisi horizontal mereka). Untuk memperbaikinya tambahkan:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;
Michael Michailidis
sumber
Pecahkan Kueri saya dengan bantuan Anda dan @Ilya Suzdalnitski. Terima kasih banyak.
Mihir Oza
33

Gunakan ini untuk membuat beberapa baris teks UILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

Cepat:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0
Abi
sumber
21
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
Gurumoorthy Arumugam
sumber
16

Jika Anda harus menggunakan:

myLabel.numberOfLines = 0;

properti Anda juga dapat menggunakan garis istirahat standar ("\n"), dalam kode, untuk memaksa baris baru.

Tim Maher-De Troyer
sumber
15

Anda dapat menggunakan \runtuk pergi ke baris berikutnya saat mengisi UILabelpenggunaan NSString.

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];
prajul
sumber
14

ayo coba ini

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          
pengguna40910
sumber
juga ini dapat diatur di seluruh atribut IB 'Lines' ke 0 pada UILabel.
KoreanXcodeWorker
11
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Solusi di atas tidak berfungsi dalam kasus saya. Saya melakukan seperti ini:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}
Bartolo-Otrit
sumber
8

Gunakan story borad: pilih label untuk mengatur jumlah baris menjadi nol ...... Atau Referensikan ini

masukkan deskripsi gambar di sini

Vijay Sharma
sumber
8

Swift 3
Tetapkan jumlah baris nol untuk informasi teks dinamis, ini akan berguna untuk berbagai teks.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

masukkan deskripsi gambar di sini

Krunal
sumber
1
Terima kasih, Krunal, ini berhasil untuk saya!
Yogesh Patel
6
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

Untuk beberapa alasan ini tidak berfungsi untuk saya di iOS 6 tidak yakin mengapa. Mencobanya dengan dan tanpa teks yang dikaitkan. Ada saran.

Rajashekar
sumber
6

Coba gunakan ini:

lblName.numberOfLines = 0;
[lblName sizeToFit];
Mubin Shaikh
sumber
sizeToFit tidak berfungsi ketika numberOfLine berbeda dari 0. Sangat menarik.
Onur Tuna
3

Hal-hal ini membantu saya

Ubah properti UILabel ini

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

Dan sambil memberikan input, gunakan String \ n untuk menampilkan kata-kata yang berbeda di baris yang berbeda.

Contoh:

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
Pengembang iPhone
sumber
3

Metode 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Sekarang panggil saja seperti ini

myLbl.lblFunction()//Replace your label name 

EX:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Metode 2:

Secara terprogram

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

Metode 3:

Melalui papan cerita

Untuk menampilkan beberapa baris yang ditetapkan 0 (Nol), ini akan menampilkan lebih dari satu baris di label Anda.

Jika Anda ingin menampilkan n baris, atur n.

Lihat di bawah layar.

masukkan deskripsi gambar di sini

Jika Anda ingin mengatur ukuran font minimum untuk label Klik Autoshrink dan Pilih opsi Ukuran Font Minimum

Lihat layar di bawah ini

masukkan deskripsi gambar di sini

Di sini mengatur ukuran font minimum

EX: 9 (Dalam gambar ini)

Jika label Anda mendapatkan lebih banyak teks pada saat itu, teks label Anda akan menyusut hingga 9

masukkan deskripsi gambar di sini

iOS
sumber
2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Gaurav Gilani
sumber
jangan lupa untuk menambahkan: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu Licks Filho
2

Anda dapat melakukannya melalui Storyboard juga:

  1. Pilih Label pada pengontrol tampilan
  2. Di Inspektur Atribut, tambah nilai opsi Garis (Tekan Alt + Cmd + 4 untuk menampilkan Inspektur Atribut)
  3. Klik dua kali Label pada pengontrol tampilan dan tulis atau tempel teks Anda
  4. Ubah ukuran Label dan / atau tambah ukuran font sehingga seluruh teks dapat ditampilkan
OsLivon
sumber
dan mengatur Lines ke 0, jika tidak hanya akan menampilkan teks yang dapat dimasukkan ke dalam jumlah baris yang ditentukan, yang lain akan dihilangkan.
toing_toing
2

Anda harus mencoba ini:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}
Pritesh
sumber
1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
Gaurav Gilani
sumber
1

Sudah dijawab, tetapi Anda dapat melakukannya secara manual di storyboard juga. Di bawah Atribut Attectores for the Label, Anda dapat mengubah Line Breaks ke Word Wrap (atau karakter wrap).

Fleija
sumber
1

Dalam fungsi ini, lewati string yang ingin Anda tetapkan dalam label dan lewati ukuran font sebagai ganti self.activityFont dan lewati lebar label di tempat 235, sekarang Anda mendapatkan tinggi label sesuai dengan string Anda. itu akan bekerja dengan baik.

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}
Nripendra singh
sumber
1

Diatur di bawah ini dalam kode atau di storyboard itu sendiri

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

dan jangan lupa untuk mengatur batasan kiri, kanan, atas dan bawah untuk label jika tidak akan bekerja.

Ankit garg
sumber
Di mana-mana dikatakan untuk mengatur bungkus kata dan no. Baris menjadi 0. Tapi tetap milikku tidak membungkus. Pengaturan kendala kiri, atas, bawah & kanan membuatnya terbungkus.
anoo_radha
1

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 
Sumona Salma
sumber
0

Pada C #, ini bekerja untuk saya di dalam UITableViewCell.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

Saya pikir intinya di sini adalah: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;
AG
sumber
-2

Kode ini mengembalikan tinggi ukuran menurut teks

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
Gaurav
sumber