Beberapa baris teks dalam UILabel


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.


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


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;

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


16

Jika Anda harus menggunakan:

myLabel.numberOfLines = 0;

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


15

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

UILabel * label;


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

14

ayo coba ini

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          

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

    //...
}


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


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.


6

Coba gunakan ini:

lblName.numberOfLines = 0;
[lblName sizeToFit];

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

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


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

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

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

1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

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


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;

}

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.


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 

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;

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