UILabel'de birden çok metin satırı


443

Birden fazla metin satırları için bir yolu var mı UILabelbenzerlerinde UITextViewya da ben onun yerine ikinci bir kullanmalıdır?


5
Not UILineBreakModeWordWrapiOS 6. kullanımdan kaldırıldı Artık kullanmalısınız NSLineBreakByWordWrapping = 0belgelerine bakın burada
Austin

Yanıtlar:


796

Bir çözüm buldum.

Biri sadece aşağıdaki kodu eklemelidir:

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

Geri yüklenen eski yanıt (referans ve 6.0'ın altında iOS'u desteklemek isteyen geliştiriciler için):

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

Yanda: her iki enum değeri 0de yine de verim verir .


16
UILineBreakModeWordWrap aslında varsayılanıdır, bu nedenle ilk satıra ihtiyacınız yoktur.
Jarred Olson

1
Hızlı kullananlara: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingvecell.textLabel?.numberOfLines = 0
boidkan

5
Xamarin-Code sağladığınız için teşekkür ederiz. Otomatik tamamlama işe yaramadı çünkü bu özelliği kısaltmayı seçtiler ... +1
Jan Gillich

Ben Jarred Olson ile anlaşmak NSLineBreakByWordWrapping olduğu varsayılan . Bunu düzeltmek için Gurumoorthy Arumugam'ın rehberi gibi sizeToFit özelliği ekledim . Etiketinizin içindeki yazı tipinin kendisini etiketin sınırlarına sığacak şekilde ayarlamasını istiyorsanız. Şunları kullanabilirsiniz: textLabel.adjustsFontSizeToFitWidth = YES; Hepinize teşekkürler.
ryan tran

@JarredOlson Docs "Bu özellik varsayılan olarak byTruncatingTail olarak ayarlanmıştır" diyor.
Bill

138

IB'de satır sayısını 0 olarak ayarlayın (sınırsız satıra izin verir)

IB kullanarak metin alanına yazarken, bir dönüş eklemek ve bir sonraki satıra gitmek için "alt-return" tuşunu kullanın (veya satırlarla ayrılmış metinlere kopyalayabilirsiniz).


1
[Bilerek bir yıldan fazla bir iş parçacığını kazdığı için…] Bazen IB'de yapabileceğim bir şey, gömülü satır sonları olmadan metin girmek , UILineBreakModeWordWrap ve numberOfLines = 0'ı ayarlamak ve sonra otomatik etiket - hala IB'de tasarlarken, yüksekliği otomatik olarak boyutlandırın. Görünümün manzaraya yeniden boyutlandırıldığı, etiketteki satır kesmelerinin sorunlu olabileceği durumu düşünüyorum. Veya ... IB'yi kötüye kullanabilirdim! Belki de etiketlerin IB içinde otomatik boyutuna sahip olması çözdüğünden daha fazla soruna neden olur? (Ayrıca, size bu noktada sizeToFit'i çağıramazsınız.)
Joe D'Andrea

UILabel için dokümanlardan aldığım "0" şey, uzun yıllar Interface Builder'ı kullanan bir arkadaşın alt getirisi.
Kendall Helmstetter Gelner

3
"Alt-return" dan bahseden tek cevap olduğu için +1. Özellikle "ctrl-return" işe yarayacak gibi görünüyor ama çalışmıyor.
paulmelnikow

52

Bulduğum en iyi çözüm (çerçevede çözülmesi gereken sinir bozucu bir soruna) vaychick'inkine benzer.

IB veya kodda satır sayısını 0 olarak ayarlamanız yeterlidir

myLabel.numberOfLines = 0;

Bu, gerekli satırları görüntüler ancak etiketi yatay olarak ortalanacak şekilde yeniden konumlandırır (böylece 1 satır ve 3 satır etiketi yatay konumlarında hizalanır). Bu eklentiyi düzeltmek için:

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;

Sorgumu senin ve @Ilya Suzdalnitski'nin yardımıyla çöz. Çok teşekkürler.
Mihir Oza

33

Birden fazla metin satırı elde etmek için bunu kullanın UILabel:

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

Swift:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

Kullanmanız gerekiyorsa:

myLabel.numberOfLines = 0;

özelliği ("\n"), yeni bir satırı zorlamak için kodda standart bir satır sonu da kullanabilirsiniz .


15

Sen kullanabilirsiniz \rdolduruyor iken sonraki satıra gitmek için UILabelkullanıyor NSString.

UILabel * label;


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

14

Hadi bunu deneyelim

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

ayrıca bu UILabel üzerinde IB 'Lines' özelliği boyunca 0 olarak ayarlanabilir.
KoreanXcodeWorker

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

Yukarıdaki çözüm benim durumumda çalışmıyor. Ben böyle yapıyorum:

- (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
Dinamik metin bilgileri için satır sayısını sıfır olarak ayarlayın, değişen metinler için yararlı olacaktır.

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

resim açıklamasını buraya girin


1
Teşekkürler Krunal Benim için çalışıyor!
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;

Bazı nedenlerden dolayı iOS 6'da benim için çalışmıyor, neden olduğundan emin değilim. İlişkilendirilmiş metinle ve ilişkilendirilmemiş metinle denedim. Herhangi bir öneri.


6

Bunu kullanmayı deneyin:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeToFit, numberOfLine 0'dan farklı olduğunda çalışmaz. İlginçtir.
Onur Tuna

3

Bunlar bana yardımcı oldu

UILabel'in bu özelliklerini değiştirin

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

Ve String girerken farklı satırlarda farklı kelimeler görüntülemek için \ n kullanın.

Misal :

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;

3

Yöntem 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
    }
}

Şimdi şöyle deyin

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

Yöntem 2:

Programlı

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

Yöntem 3:

Hikaye panosu aracılığıyla

Birden fazla satırı 0 (Sıfır) olarak görüntülemek için, etiketinizde birden fazla satır görüntülenir.

N satırını görüntülemek istiyorsanız, n'yi ayarlayın.

Aşağıdaki ekrana bakın.

resim açıklamasını buraya girin

Etiket için minimum yazı tipi boyutunu ayarlamak istiyorsanız Otomatik Ayarla'yı ve Minimum Yazı Tipi Boyutunu Seç seçeneğini tıklayın

Aşağıdaki ekranlara bakın

resim açıklamasını buraya girin

Burada minimum yazı tipi boyutunu ayarlayın

EX: 9 (Bu resimde)

Etiketiniz o sırada daha fazla metin alırsa, etiket metniniz 9'a kadar küçülür

resim açıklamasını buraya girin


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

eklemeyi unutmayın: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu Filho

2

Bunu Storyboard üzerinden de yapabilirsiniz:

  1. Görünüm denetleyicisindeki Etiketi seçin
  2. Özellik Denetçisinde, Çizgi seçeneğinin değerini artırın (Özellik Denetçisini göstermek için Alt + Cmd + 4 tuşlarına basın)
  3. Görünüm denetleyicisindeki Etiketi çift tıklayın ve metninizi yazın veya yapıştırın
  4. Etiketi yeniden boyutlandırın ve / veya tüm metnin gösterilebilmesi için yazı tipi boyutunu büyütün

ve Satırları 0 olarak ayarlayın, aksi takdirde yalnızca belirtilen satır sayısına eklenebilecek metni gösterir, diğerleri atlanır.
toing_toing

2

bunu denemelisin:

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

Zaten yanıtlandı, ancak film şeridinde de manuel olarak yapabilirsiniz. Etiketin Özellik Denetçisi altında, Satır Sonlarını Word Wrap (veya karakter wrap) olarak değiştirebilirsiniz.


1

Bu işlevde, etikette atamak istediğiniz yazı dizesini ve self.activityFont yerine yazı tipi boyutunu geçirin ve 235 yerine etiket genişliğini geçirin, şimdi dizenize göre etiket yüksekliği elde edersiniz. iyi çalışır.

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

}

1

Aşağıda kodda veya film şeridinin kendisinde belirtilmiştir

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

ve lütfen etiket için sol, sağ, üst ve alt kısıtlamaları ayarlamayı unutmayın, aksi takdirde çalışmaz.


Her yerde kelime kaydırmayı ve satır sayısını 0'a ayarladığını söylüyor. Ama yine de benimki sarmadı. Sol, üst, alt ve sağ kısıtlamanın ayarlanması onu sarıyordu.
anoo_radha

1

Hızlı 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

C #, bu benim için UITableViewCell içinde çalıştı.

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

Bence buradaki nokta: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

-2

Bu kod metne göre boyut yüksekliğini döndürüyor

+ (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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.