Più righe di testo in UILabel


Risposte:


796

Ho trovato una soluzione

Basta aggiungere il seguente codice:

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

Vecchia risposta ripristinata (per riferimento e sviluppatori disposti a supportare iOS sotto 6.0):

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

A parte: entrambi i valori di enum cedono 0comunque.


16
UILineBreakModeWordWrap è in realtà l'impostazione predefinita, quindi non è necessaria la prima riga.
Jarred Olson,

1
Per coloro che usano swift: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingecell.textLabel?.numberOfLines = 0
boidkan il

5
Grazie per aver fornito anche il codice Xamarin. Il completamento automatico non ha funzionato perché hanno scelto di abbreviare quella proprietà ... +1
Jan Gillich

Sono d'accordo con Jarred Olson, NSLineBreakByWordWrapping è l' impostazione predefinita . Ho aggiunto la dimensione della proprietà ToFit come la guida di Gurumoorthy Arumugam per risolverlo. Se si desidera che il carattere all'interno dell'etichetta si adegui ai limiti dell'etichetta. È possibile utilizzare: textLabel.adjustsFontSizeToFitWidth = YES; Ringrazia tutti.
Ryan Tran,

@JarredOlson Docs dice "Questa proprietà è impostata da TruncatingTail per impostazione predefinita."
Bill,

138

In IB, impostare il numero di righe su 0 (consente righe illimitate)

Quando si digita all'interno del campo di testo utilizzando IB, utilizzare "alt-return" per inserire un ritorno e passare alla riga successiva (oppure è possibile copiare nel testo già separato da linee).


1
[Mentre scava consapevolmente un thread di più di un anno ...] Una cosa che a volte vorrei poter fare in IB è inserire il testo senza interruzioni di riga incorporate, impostare UILineBreakModeWordWrap e numberOfLines = 0 e quindi avere l'etichetta auto - dimensiona automaticamente l'altezza, pur continuando a progettare in IB. Sto pensando al caso in cui la vista viene ridimensionata in orizzontale, dove le interruzioni di linea nell'etichetta potrebbero essere problematiche. Oppure ... potrei usare male IB! Forse avere le dimensioni automatiche delle etichette in IB causa più problemi di quanti ne risolva? (Inoltre, non puoi comunque invocare sizeToFit a questo punto.)
Joe D'Andrea,

La cosa "0" che ho ricevuto dai documenti di UILabel, l'alt-return di un amico che utilizza Interface Builder da molti anni.
Kendall Helmstetter Gelner,

3
+1 per essere l'unica risposta a menzionare "alt-return". In particolare "ctrl-return" sembra che funzioni ma non lo fa.
paulmelnikow,

52

La migliore soluzione che ho trovato (a un problema altrimenti frustrante che avrebbe dovuto essere risolto nel quadro) è simile a quella di Vaychick.

Basta impostare il numero di righe su 0 in IB o codice

myLabel.numberOfLines = 0;

Questo visualizzerà le linee necessarie ma riposizionerà l'etichetta in modo che sia centrata orizzontalmente (in modo che un'etichetta di 1 linea e 3 linee siano allineate nella loro posizione orizzontale). Per risolvere il problema, aggiungi:

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;

Risolvi la mia domanda con l'aiuto di te e @Ilya Suzdalnitski. Molte grazie.
Mihir Oza,

33

Usa questo per avere più righe di testo in UILabel:

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

Swift:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

Se devi usare:

myLabel.numberOfLines = 0;

È inoltre possibile utilizzare un'interruzione di riga standard ("\n"), nel codice, per forzare una nuova riga.


15

È possibile utilizzare \rper passare alla riga successiva durante il riempimento UILabeldell'utilizzo NSString.

UILabel * label;


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

14

proviamo questo

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

anche questo può essere impostato sull'attributo IB 'Lines' su 0 su UILabel.
KoreanXcodeWorker,

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

La soluzione sopra non funziona nel mio caso. Sto facendo così:

- (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
Imposta il numero di righe zero per informazioni di testo dinamiche, sarà utile per variare il testo.

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

inserisci qui la descrizione dell'immagine


1
Grazie Krunal sta funzionando per me!
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;

Per alcuni motivi non funziona per me in iOS 6 non so perché. Ho provato con e senza testo attribuito. Eventuali suggerimenti.


6

Prova a usare questo:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeToFit non funziona quando numberOfLine è diverso da 0. È interessante.
Onur Tuna,

3

Queste cose mi hanno aiutato

Modifica queste proprietà di UILabel

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

E mentre dai l'input String usa \ n per visualizzare parole diverse su righe diverse.

Esempio :

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

3

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

Adesso chiama semplicemente così

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

Metodo 2:

programmazione

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

Metodo 3:

Attraverso la scheda Story

Per visualizzare più righe impostate 0 (zero), verrà visualizzata più di una riga nell'etichetta.

Se si desidera visualizzare n righe, impostare n.

Vedi sotto lo schermo.

inserisci qui la descrizione dell'immagine

Se si desidera impostare la dimensione minima del carattere per l'etichetta Fare clic su Restringimento automatico e selezionare l'opzione Dimensione minima carattere

Vedi sotto le schermate

inserisci qui la descrizione dell'immagine

Qui imposta la dimensione minima del carattere

EX: 9 (In questa immagine)

Se l'etichetta ottiene più testo in quel momento, il testo dell'etichetta verrà ridotto a 9

inserisci qui la descrizione dell'immagine


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

non dimenticare di aggiungere: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu lecca Filho il

2

Puoi farlo anche tramite lo Storyboard:

  1. Seleziona l'etichetta sul controller di visualizzazione
  2. Nell'Inspector degli attributi, aumenta il valore dell'opzione Linea (Premi Alt + Cmd + 4 per visualizzare Ispettore degli attributi)
  3. Fare doppio clic sull'etichetta nel controller di visualizzazione e scrivere o incollare il testo
  4. Ridimensiona l'etichetta e / o aumenta la dimensione del carattere in modo da poter mostrare l'intero testo

e imposta Lines su 0, altrimenti mostrerà solo il testo che può essere inserito nel numero di righe specificato, gli altri verranno omessi.
toing_toing

2

dovresti provare questo:

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

Ho già risposto, ma puoi farlo manualmente anche nello storyboard. Sotto Impostazioni Attributi per l'etichetta, puoi modificare le interruzioni di riga in A capo automatico (o a capo automatico).


1

In questa funzione passare la stringa che si desidera assegnare nell'etichetta e passare la dimensione del carattere al posto di self.activityFont e passare la larghezza dell'etichetta al posto di 235, ora si ottiene l'altezza dell'etichetta in base alla stringa. funzionerà benissimo.

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

}

1

Impostare di seguito nel codice o nello storyboard stesso

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

e non dimenticare di impostare i vincoli sinistro, destro, superiore e inferiore per l'etichetta, altrimenti non funzionerà.


Ovunque dice di impostare la parola a capo e il numero di righe su 0. Ma la mia non si è ancora conclusa. L'impostazione del vincolo sinistro, superiore, inferiore e destro lo ha reso avvolgente.
anoo_radha,

1

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

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

0

Su C #, questo ha funzionato per me all'interno di 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);

Penso che il punto qui sia: -

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

-2

Questo codice restituisce l'altezza delle dimensioni in base al testo

+ (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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.