Ricerca…


introduzione

La classe UILabel implementa una visualizzazione di testo di sola lettura. È possibile utilizzare questa classe per disegnare una o più righe di testo statico, ad esempio quelle che è possibile utilizzare per identificare altre parti dell'interfaccia utente. La classe UILabel di base fornisce supporto per lo stile semplice e complesso del testo dell'etichetta. Puoi anche controllare gli aspetti dell'aspetto, ad esempio se l'etichetta utilizza un'ombra o disegna con un'evidenziazione. Se necessario, è possibile personalizzare ulteriormente l'aspetto del testo mediante sottoclassi.

Sintassi

  • UILabel.numberOfLines: Int // ottiene o imposta il numero massimo di righe che l'etichetta può avere. 0 è illimitato
  • UILabel.text: String? // ottiene o imposta il testo visualizzato dall'etichetta
  • UILabel.textColor: UIColor! // ottiene o imposta il colore del testo sull'etichetta
  • UILabel.tintColor: UIColor! // ottiene o imposta il colore della tinta dell'etichetta
  • UILabel.attributedText: NSAttributedString? // ottiene o imposta il testo attribuito dell'etichetta
  • UILabel.font: UIFont! // ottiene o imposta il carattere del testo sull'etichetta
  • UILabel.textAlignment: NSTextAlignment // ottiene o imposta l'allineamento del testo

Osservazioni

UILabels sono viste che possono essere utilizzate per visualizzare una o più righe di testo. Contiene diversi modi di stilizzare il testo, come ombre, colori del testo e caratteri.

UILabels può anche visualizzare le stringhe attribuite, che è testo + markup in linea per applicare gli stili a porzioni di testo.

UILabel non è conforme al protocollo UIAppearance, quindi non è possibile utilizzare i metodi proxy di UIAppearance per personalizzare l'aspetto di UILabels. Vedi questa discussione per ulteriori informazioni.

Riferimento per gli sviluppatori Apple qui

Modifica del testo in un'etichetta esistente

La modifica del testo di una UILabel esistente può essere effettuata accedendo e modificando la proprietà text di UILabel . Questo può essere fatto direttamente usando letterali String o indirettamente usando variabili.

Impostazione del testo con valori letterali String

veloce

label.text = "the new text"

Objective-C

// Dot Notation
label.text = @"the new text";

// Message Pattern
[label setText:@"the new text"];

Impostazione del testo con una variabile

veloce

let stringVar = "basic String var"
label.text = stringVar

Objective-C

NSString * stringVar = @"basic String var";

// Dot Notation
label.text = stringVar;

// Message Pattern
[label setText: stringVar];

Colore del testo

È possibile utilizzare la proprietà textColor dell'etichetta per applicare un colore di testo all'intero testo dell'etichetta.

veloce

label.textColor = UIColor.redColor()
label.textColor = UIColor(red: 64.0/255.0, green: 88.0/255.0, blue: 41.0/225.0, alpha: 1)

Swift 3

label.textColor = UIColor.red
label.textColor = UIColor(red: 64.0/255.0, green: 88.0/255.0, blue: 41.0/225.0, alpha: 1)

Objective-C

label.textColor = [UIColor redColor];
label.textColor = [UIColor colorWithRed:64.0f/255.0f green:88.0f/255.0f blue:41.0f/255.0f alpha:1.0f];

Applicazione del colore del testo a una parte del testo

Puoi anche variare il colore del testo (o altri attributi) di porzioni del testo usando NSAttributedString :

Objective-C

attributedString = [[NSMutableAttributedString alloc] initWithString:@"The grass is green; the sky is blue."];
[attributedString addAttribute: NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(13, 5)];
[attributedString addAttribute: NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(31, 4)];
label.attributedText = attributesString;

veloce

let attributedString = NSMutableAttributedString(string: "The grass is green; the sky is blue.")
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.green(), range: NSRange(location: 13, length: 5))
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue(), range: NSRange(location: 31, length: 4))
label.attributedText = attributedString

Allineamento del testo

veloce

label.textAlignment = NSTextAlignment.left 
//or the shorter
label.textAlignment = .left 

Qualsiasi valore nella NSTextAlignment enum è valida: .left , .center , .right , .justified , .natural

Objective-C

label.textAlignment = NSTextAlignmentLeft;

Qualsiasi valore NSTextAlignment è valido: NSTextAlignmentLeft , NSTextAlignmentCenter , NSTextAlignmentRight , NSTextAlignmentJustified , NSTextAlignmentNatural

L'allineamento verticale in UILabel non è supportato UILabel : allinea verticalmente il testo in cima a un UILabel

Crea un UILabel

Con una cornice

Quando conosci le dimensioni esatte che desideri impostare per l'etichetta, puoi inizializzare un UILabel con una cornice CGRect .

veloce

let frame = CGRect(x: 0, y: 0, width: 200, height: 21)
let label = UILabel(frame: frame)
view.addSubview(label)

Objective-C

CGRect frame = CGRectMake(0, 0, 200, 21);
UILabel *label = [[UILabel alloc] initWithFrame:frame];
[view addSubview:label];

Con layout automatico

È possibile aggiungere vincoli su un UILabel quando si desidera che iOS calcoli dinamicamente il frame in fase di runtime.

veloce

let label = UILabel()
label.backgroundColor = .red
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)

NSLayoutConstraint.activate([
    //stick the top of the label to the top of its superview:
    label.topAnchor.constraint(equalTo: view.topAnchor)

    //stick the left of the label to the left of its superview
    //if the alphabet is left-to-right, or to the right of its 
    //superview if the alphabet is right-to-left:
    label.leadingAnchor.constraint(equalTo: view.leadingAnchor)

    //stick the label's bottom to the bottom of its superview:
    label.bottomAnchor.constraint(equalTo: view.bottomAnchor)

    //the label's width should be equal to 100 points:
    label.widthAnchor.constraint(equalToConstant: 100)
])

Objective-C

UILabel *label = [[UILabel alloc] init];

Con Objective-c + Visual Format Language (VFL)

  UILabel *label = [UILabel new];
  label.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview label];
  // add horizontal constraints with 5 left and right padding from the leading and trailing

  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[labelName]-5-|"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:@{@"labelName":label}]];
  // vertical constraints that will use the height of the superView with no padding on top and bottom
  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[labelName]|"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:@{@"labelName":label}]]

La documentazione VFL può essere trovata qui

Dopo aver creato l'etichetta, assicurati di impostare le dimensioni tramite Auto Layout. Xcode mostrerà errori se è fatto in modo improprio.

Con Interface Builder

Inoltre, si utilizza Interface Builder per aggiungere una UILabel allo Storyboard o .xib file .xib trascinando Label dal pannello Libreria oggetti e rilasciandola in una vista nell'area di disegno:

Screenshot da Interface Builder

Invece di specificare un frame (posizione e dimensione) per un UILabel a livello di UILabel , uno Storyboard o un file .xib consente di utilizzare Auto Layout per aggiungere vincoli al controllo.

Per accedere a questa etichetta creata da storyboard o xib creare un IBOutlet di questa etichetta.

Collegamento tra Interface Builder e View Controller

Dopo aver aggiunto un UILabel al vostro Storyboard o .xib il file è possibile collegare al vostro codice premendo Control ⌃ e trascinando il mouse tra UILabel al ViewController , o si potrebbe trascinare al codice mentre clic destro per la sua avere lo stesso effetto

inserisci la descrizione dell'immagine qui

Nella finestra di dialogo delle proprietà, puoi impostare il nome di UILabel e impostarlo come strong o weak . Per ulteriori informazioni su strong e weak , vedere questo ,

L'altro modo è di creare lo sbocco programmaticamente come segue:

veloce

@IBOutlet weak var nameLabel : UILabel!

Objective-C

@property (nonatomic, weak) IBOutlet UILabel *nameLabel;

Imposta carattere

veloce

let label = UILabel()

Objective-C

UILabel *label = [[UILabel alloc] init];
or
UILabel *label = [UILabel new]; // convenience method for calling alloc-init

Cambia la dimensione del carattere predefinito

veloce

label.font = UIFont.systemFontOfSize(17)

Swift 3

label.font = UIFont.systemFont(ofSize: 17)

Objective-C

label.font = [UIFont systemFontOfSize:17];

Usa un peso specifico per il font

iOS 8.2

veloce

label.font = UIFont.systemFontOfSize(17, weight: UIFontWeightBold)

Swift3

label.font = UIFont.systemFont(ofSize: 17, weight: UIFontWeightBold)

Objective-C

label.font = [UIFont systemFontOfSize:17 weight:UIFontWeightBold];
iOS 8.2

veloce

label.font = UIFont.boldSystemFontOfSize(17)

Swift3

label.font = UIFont.boldSystemFont(ofSize: 17)

Objective-C

label.font = [UIFont boldSystemFontOfSize:17];

Usa uno stile di testo di tipo dinamico.

La dimensione del carattere e del punto sarà basata sulla dimensione di lettura preferita dell'utente.

veloce

label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)

Swift 3

label.font = UIFont.preferredFont(forTextStyle: .body)

Objective-C

label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];

Utilizzare un font diverso completamente

veloce

label.font = UIFont(name: "Avenir", size: 15)

Objective-C

label.font = [UIFont fontWithName:@"Avenir" size:15];

Sostituisci la dimensione del carattere

Un modo per impostare la dimensione del font senza conoscere la famiglia di font è usare la proprietà font di UILabel .

veloce

label.font = label.font.fontWithSize(15)

Swift 3

label.font = label.font.withSize(15)

Objective-C

label.font = [label.font fontWithSize:15];

Usa carattere personalizzato Swift

Fare riferimento a questo link

Numero di linee

Quando si crea un'etichetta e si imposta il testo in modo che sia più di una singola riga che può essere visualizzata, verrà troncata e verrà visualizzata solo una riga di testo che termina con tre punti (...). Ciò è dovuto al fatto che una proprietà denominata numberOfLines è impostata su 1 e pertanto verrà visualizzata una sola riga. È un errore comune nella gestione di UILabel , e molte persone pensano che sia un bug, oppure possono usare più di un'etichetta per mostrare più di una riga di testo, ma semplicemente modificando questa proprietà, possiamo dire a una UILabel di accetta fino al numero specificato di righe. Ad esempio, se questa proprietà è impostata su 5, l'etichetta può mostrare 1, 2, 3, 4 o 5 linee di dati.

Impostazione del valore a livello di codice

Per impostare questa proprietà, assegnagli semplicemente un nuovo numero intero:

veloce

label.numberOfLines = 2

Objective-C

label.numberOfLines = 2;

Nota

È possibile impostare questa proprietà su 0. Tuttavia, ciò non significa che non accetterà alcuna riga, ma significa che l'etichetta può avere tutte le linee necessarie (ovvero "Infinity"):

veloce

label.numberOfLines = 0

Objective-C

label.numberOfLines = 0;

Nota

Se l'etichetta ha un vincolo di altezza, il vincolo verrà rispettato. In questo caso, label.numberOfLines = 0 potrebbe non funzionare come previsto.

Nota

Per un testo multilinea più complesso, UITextView potrebbe essere più adatto. *

Impostazione del valore in Interface Builder

Invece di impostare numberOfLines di numberOfLines , è possibile utilizzare uno Storyboard o un file .xib e impostare la proprietà numberOfLines . In questo modo, otteniamo gli stessi risultati del codice precedente.

Come di seguito:

inserisci la descrizione dell'immagine qui

Dimensioni per adattarsi

Supponiamo che tu abbia un UILabel sullo storyboard e che tu abbia creato un IBOutlet per esso in ViewController.swift / ViewController.m e lo labelOne .

Per rendere le modifiche facilmente visibili, cambia il backgroundColor e textColor di labelOne nel metodo viewDidLoad :

La funzione sizeToFit viene utilizzata quando si desidera ridimensionare automaticamente un'etichetta in base al contenuto memorizzato al suo interno.

veloce

labelOne.backgroundColor = UIColor.blueColor()
labelOne.textColor = UIColor.whiteColor()
labelOne.text = "Hello, World!"
labelOne.sizeToFit()

Swift 3

labelOne.backgroundColor = UIColor.blue
labelOne.textColor = UIColor.white
labelOne.text = "Hello, World!"
labelOne.sizeToFit()

Objective-C

labelOne.backgroundColor = [UIColor blueColor];
labelOne.textColor = [UIColor whiteColor];
labelOne.text = @"Hello, World!";
[labelOne sizeToFit];

L'output per il codice sopra riportato è:

inserisci la descrizione dell'immagine qui

Come puoi vedere, non vi è alcun cambiamento in quanto il testo si adatta perfettamente a labelOne. sizeToFit cambia solo la cornice dell'etichetta.

Cambiamo il testo in uno leggermente più lungo:

labelOne.text = "Hello, World! I’m glad to be alive!"

Ora, labelOne si presenta così:

inserisci la descrizione dell'immagine qui

Anche chiamare sizeToFit non cambia nulla. Questo perché, per impostazione predefinita, il numero di linee mostrato da UILabel è impostato su 1. Passiamo a zero sullo storyboard:

inserisci la descrizione dell'immagine qui

Questa volta, quando eseguiamo l'app, labelOne appare correttamente:

inserisci la descrizione dell'immagine qui

La proprietà numberOfLines può anche essere modificata nel file ViewController :

// Objective-C
labelOne.numberOfLines = 0; 

// Swift
labelOne.numberOfLines = 0

Colore di sfondo

veloce

label.backgroundColor = UIColor.redColor()

label.backgroundColor = .redColor()

Swift 3

label.backgroundColor = UIColor.red

Objective-C

label.backgroundColor = [UIColor redColor];

Aggiungi ombre al testo

veloce

label1.layer.shadowOffset = CGSize(width: 3, height: 3)
label1.layer.shadowOpacity = 0.7
label1.layer.shadowRadius = 2

Swift 3

label1.layer.shadowOffset = CGSize(width: 3, height: 3)
label1.layer.shadowOpacity = 0.7
label1.layer.shadowRadius = 2

Objective-C

label1.layer.shadowOffset = CGSizeMake(3, 3);
label1.layer.shadowOpacity = 0.7;
label1.layer.shadowRadius = 2;

inserisci la descrizione dell'immagine qui

Altezza variabile usando i vincoli

Puoi creare un UILabel con un'altezza dinamica utilizzando il layout automatico.

È necessario impostare numberOfLines su zero (0) e aggiungere un'altezza minima impostando un vincolo con una relazione di tipo .GreaterThanOrEqual sull'attributo .Height

iOS 6

veloce

label.numberOfLines = 0

let heightConstraint = NSLayoutConstraint(
    item: label,
    attribute: .Height,
    relatedBy: .GreaterThanOrEqual,
    toItem: nil,
    attribute: .NotAnAttribute,
    multiplier: 0,
    constant: 20
)

label.addConstraint(heightConstraint)
iOS 9

veloce

label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.heightAnchor.constraintGreaterThanOrEqualToConstant(20).active = true

LineBreakMode

Usando il codice

UILabel.lineBreakMode: NSLineBreakMode

veloce

label.lineBreakMode = .ByTruncatingTail
  • .ByWordWrapping
  • .ByCharWrapping
  • .ByClipping
  • .ByTruncatingHead
  • .ByTruncatingTail
  • .ByTruncatingMiddle

Swift 3

label.lineBreakMode = .byTruncatingTail
  • .byWordWrapping
  • .byCharWrapping
  • .byClipping
  • .byTruncatingHead
  • .byTruncatingTail
  • .byTruncatingMiddle

Objective-C

[label setLineBreakMode:NSLineBreakByTruncatingTail];
  • NSLineBreakByWordWrapping
  • NSLineBreakByCharWrapping
  • NSLineBreakByClipping
  • NSLineBreakByTruncatingHead
  • NSLineBreakByTruncatingTail
  • NSLineBreakByTruncatingMiddle

Usando lo storyboard

Questo può anche essere impostato nell'ispettore attributi di un UILabel:

inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui

costanti

  • Word Wrapping - il wrapping avviene ai confini delle parole, a meno che la parola stessa non si adatti a una singola riga
  • Char Wrapping: il wrapping avviene prima del primo carattere che non si adatta
  • Ritaglio: le linee non sono semplicemente disegnate oltre il bordo del contenitore di testo
  • Testa troncante - la linea viene visualizzata in modo che la fine si inserisca nel contenitore e il testo mancante all'inizio della linea sia indicato da un glifo con ellissi
  • Truncating Tail - la linea viene visualizzata in modo che l'inizio si inserisca nel contenitore e il testo mancante alla fine della linea sia indicato da un glifo con ellissi
  • Truncating Middle - la linea viene visualizzata in modo che l'inizio e la fine si inseriscano nel contenitore e il testo mancante nel mezzo sia indicato da un glifo con ellissi

Calcola i limiti di contenuto (per esempio altezze delle celle dinamiche)

Un caso d'uso comune per voler calcolare il fotogramma che un'etichetta occuperà è dimensionare opportunamente le celle della vista tabella. Il modo consigliato per farlo è utilizzare il metodo NSString boundingRectWithSize:options:attributes:context:

options prendono le options disegno per le stringhe:

  • NSStringDrawingUsesLineFragmentOrigin deve essere utilizzato per le etichette con più righe
  • NSStringDrawingTruncatesLastVisibleLine dovrebbe essere aggiunto utilizzando il carattere | operatore se ci sono un numero massimo di linee

attributes è un NSDictionary di attributi che NSDictionary sulle stringhe attribuite (lista completa: Apple Docs ) ma i fattori che influenzano l'altezza includono:

  • NSFontAttributeName : molto importante, la dimensione e la famiglia di caratteri è una parte critica delle dimensioni visualizzate dell'etichetta.

  • NSParagraphStyleAttributeName : per personalizzare la modalità di visualizzazione del testo. Ciò include l'interlinea, l'allineamento del testo, lo stile di troncamento e alcune altre opzioni. Se non hai modificato esplicitamente nessuno di questi valori, non dovresti preoccuparti di questo, ma potrebbe essere importante se hai attivato alcuni valori su IB.

context dovrebbe essere nil poiché il caso d'uso principale di NSStringDrawingContext è quello di consentire il ridimensionamento del font per adattarlo a un rect specificato, il che non dovrebbe essere il caso se stiamo calcolando un'altezza dinamica.

Obiettivo C

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

    NSString *labelContent = cell.theLabel.text;
    // you may choose to get the content directly from the data source if you have done minimal customizations to the font or are comfortable with hardcoding a few values
//    NSString *labelContent = [self.dataSource objectAtIndexPath:indexPath];
    
    // value may be hardcoded if retrieved from data source
    NSFont *labelFont = [cell.theLabel font];
    
    // The NSParagraphStyle, even if you did not code any changes these values may have been altered in IB
    NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; 
    paragraphStyle.alignment = NSTextAlignmentCenter;

    NSDictionary *attributes = @{NSFontAttributeName: labelFont,
                                 NSParagraphStyleAttributeName: paragraphStyle};

    // The width is also important to the height
    CGFloat labelWidth = CGRectGetWidth(cell.theLabel.frame);
    // If you have been hardcoding up to this point you will be able to get this value by subtracting the padding on left and right from tableView.bounds.size.width
//    CGFloat labelWidth = CGRectGetWidth(tableView.frame) - 20.0f - 20.0f;

    CGRect bodyBounds = [labelContent boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

    return CGRectGetHeight(bodyBounds) + heightOfObjectsOnTopOfLabel + heightOfObjectBelowLabel;
}

Swfit 3

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    var cell = tableView.cellForRow(atIndexPath: indexPath)!
    var labelContent = cell.theLabel.text
    var labelFont = cell.theLabel.font
    var paragraphStyle = NSMutableParagraphStyle()

    paragraphStyle.lineBreakMode = .byWordWrapping
    paragraphStyle.alignment = .center

    var attributes = [NSFontAttributeName: labelFont, NSParagraphStyleAttributeName: paragraphStyle]

    var labelWidth: CGFloat = cell.theLabel.frame.width

    var bodyBounds = labelContent.boundingRect(withSize: CGSize(width: width, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: attributes, context: nil)

    return bodyBounds.height + heightOfObjectsOnTopOfLabel + heightOfObjectBelowLabel
}

Viceversa, se si dispone di un numero massimo di righe impostato, è necessario innanzitutto calcolare l'altezza di una singola riga per assicurarsi che non si ottenga un valore più alto della dimensione consentita:

    // We calculate the height of a line by omitting the NSStringDrawingUsesLineFragmentOrigin option, which will assume an infinitely wide label
    CGRect singleLineRect = [labelContent boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
                                                 options:NSStringDrawingTruncatesLastVisibleLine
                                                 context:nil];
    CGFloat lineHeight = CGRectGetHeight(singleLineRect);
    CGFloat maxHeight = lineHeight * cell.theLabel.numberOfLines;

    // Now you can call the method appropriately
    CGRect bodyBounds = [labelContent boundingRectWithSize:CGSizeMake(width, maxHeight) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine) attributes:attributes context:nil];

    return CGRectGetHeight(bodyBounds) + heightOfObjectsOnTopOfLabel + heightOfObjectBelowLabel;

Etichetta cliccabile

NOTA: nella maggior parte dei casi, è preferibile utilizzare un UIButton anziché creare un UILabel è possibile toccare. Utilizza questo esempio, se sei sicuro, che non vuoi utilizzare un UIButton per qualche motivo.

  1. Crea etichetta
  2. Abilita l'interazione dell'utente
  3. Aggiungi UITapGestureRecognizer

La chiave per creare un UILabel cliccabile è consentire l'interazione dell'utente.

veloce

let label = UILabel()
label.userInteractionEnabled = true

let gesture = UITapGestureRecognizer(target: self, action: #selector(labelClicked(_:)))
label.addGestureRecognizer(gesture)

Objective-C

UILabel *label = [[UILabel alloc] init];
[label setUserInteractionEnabled:YES];

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClicked:)];
[label addGestureRecognizer:gesture];

Impostazione "userInteractionEnabled" nell'ispettore degli attributi dello storyboard

Invece di usare il codice, puoi selezionare l'UILabel all'interno dello storyboard e controllare l'opzione:

inserisci la descrizione dell'immagine qui

Cornice dell'etichetta dinamica dalla lunghezza del testo sconosciuta

A volte dobbiamo ridimensionare un UILabel basato su contenuti dinamici in cui la lunghezza del testo è sconosciuta. In questo esempio, la larghezza di UILabel è fissata a 280 punti e l'altezza è infinita, diciamo 9999. Stima del fotogramma rispetto allo stile del testo e a maximumLabelSize.

Objective-C

UILabel * label = [[UILabel alloc] init];

NSString *message = @"Some dynamic text for label";

//set the text and style if any.
label.text = message;

label.numberOfLines = 0;

CGSize maximumLabelSize = CGSizeMake(280, 9999); //280:max width of label and 9999-max height of label.

// use font information from the UILabel to calculate the size
CGSize expectedLabelSize = [label sizeThatFits:maximumLabelSize];

//Deprecated in iOS 7.0
//CGSize expectedLabelSize = [message sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

// create a frame that is filled with the UILabel frame data
CGRect newFrame = label.frame;

// resizing the frame to calculated size
newFrame.size.height = expectedLabelSize.height;

// put calculated frame into UILabel frame
label.frame = newFrame;

veloce

var message: String = "Some dynamic text for label"
//set the text and style if any.
label.text = message
label.numberOfLines = 0
var maximumLabelSize: CGSize = CGSize(width: 280, height: 9999)
var expectedLabelSize: CGSize = label.sizeThatFits(maximumLabelSize)
// create a frame that is filled with the UILabel frame data
var newFrame: CGRect = label.frame
// resizing the frame to calculated size
newFrame.size.height = expectedLabelSize.height
// put calculated frame into UILabel frame
label.frame = newFrame

Etichetta attribuita testo

01. Sottolineatura del testo: - Linea singola / doppia, Strike Through: - Linea singola / doppia

Passo 1

Seleziona l'etichetta e modifica il tipo di etichetta Pianura su Attribuito inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui

Passo 2

Fai clic sul testo dell'etichetta e fai clic con il pulsante destro del mouse

inserisci la descrizione dell'immagine qui

Passaggio 3

Quindi fare clic su Font -> Mostra caratteri

inserisci la descrizione dell'immagine qui

Passaggio 4

Quindi verrà visualizzata la visualizzazione dei caratteri e fare clic sul pulsante di sottolineatura per rendere il testo sottolineato o fare clic sul pulsante barrato per rendere il testo barrato. E selezionare una riga singola o una doppia linea.

inserisci la descrizione dell'immagine qui

Infine, fai clic su invio e l'etichetta verrà mostrata come sottolineato o barrato in base alla selezione.

inserisci la descrizione dell'immagine qui

02. Aggiungi effetti shaddow / sfocatura dello sfondo del testo

Ottieni la vista Font come sopra descritto e fai clic sul pulsante degli effetti.

inserisci la descrizione dell'immagine qui

Se non vedi l'anteprima clicca l'immagine dello spettacolo nelle impostazioni

inserisci la descrizione dell'immagine qui

Infine cambia shaddow e offset in base alle tue preferenze.

inserisci la descrizione dell'immagine qui

Giustifica il testo

veloce

let sampleText = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

// Create label
let label = UILabel(frame: CGRectMake(0, 0, view.frame.size.width, 400))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping

// Justify text through paragraph style
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.Justified
let attributes = [NSParagraphStyleAttributeName: paragraphStyle, NSBaselineOffsetAttributeName: NSNumber(float: 0)]
let attributedString = NSAttributedString(string: sampleText, attributes: attributes)
label.attributedText = attributedString
view.addSubview(label)

Objective-C

  NSString *sampleText = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
    
    // Create label
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 400)];
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWordWrapping;
    
    
    // Justify text through paragraph style
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.alignment = NSTextAlignmentJustified;
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:sampleText attributes:@{
                    NSParagraphStyleAttributeName : paragraphStyle,
                    NSBaselineOffsetAttributeName : [NSNumber numberWithFloat:0]
                    }];
    label.attributedText = attributedString;
    [self.view addSubview:label];

Etichetta di ridimensionamento automatico per adattarsi al testo

Questo esempio mostra come la larghezza di un'etichetta può ridimensionarsi automaticamente quando il contenuto del testo cambia.

gif animato di etichetta auto-ridimensionamento

Pin i bordi sinistro e superiore

Basta usare il layout automatico per aggiungere vincoli per bloccare i lati sinistro e superiore dell'etichetta.

screenshot: imposta i vincoli di layout automatico

Dopo questo ridimensionerà automaticamente.

Gli appunti

  • Questo esempio deriva da questa risposta di Overflow dello stack .

  • Non aggiungere vincoli per la larghezza e l'altezza. Le etichette hanno una dimensione intrinseca basata sul loro contenuto testuale.

  • Non è necessario impostare sizeToFit quando si utilizza il layout automatico. Il codice completo per il progetto di esempio è qui:

      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"
          }
      }
    
  • Questo metodo può anche essere utilizzato per spaziare correttamente più etichette in orizzontale come in questo esempio .

gif animato che mostra il ridimensionamento automatico di più etichette

  • Se vuoi che la tua etichetta myLabel.preferredMaxLayoutWidth = 150 // or whatever imposta il numero di linee su 0 in IB e aggiungi myLabel.preferredMaxLayoutWidth = 150 // or whatever nel codice. (Il pulsante è anche appuntato sul fondo dell'etichetta in modo che si muova verso il basso quando l'altezza dell'etichetta aumenta.)

screenshot: ridimensionamento multi-linea

Ottieni le dimensioni di UILabel in base al testo e al carattere

NSString fornisce il metodo boundingRectWithSize che può essere utilizzato per prevedere il CGSize risultante di un UILabel base al testo e al font senza la necessità di creare un UILabel

Objective-C

[[text boundingRectWithSize:maxSize options:(NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName: fontName} context:nil] size];

veloce

let nsText = text as NSString?
nsText?.boundingRectWithSize(maxSize, options: [.TruncatesLastVisibleLine, .UsesLineFragmentOrigin], attributes: [NSFontAttributeName: fontName], context: nil).size

veloce

Crea etichetta ed etichetta Uscita vincolo altezza. Aggiungi sotto il codice in cui dovrai assegnare il testo all'etichetta.

@IBOutlet var lblDescriptionHeightConstration: NSLayoutConstraint! 
@IBOutlet weak var lblDescription: UILabel!

let maxWidth = UIScreen.mainScreen().bounds.size.width - 40
let sizeOfLabel = self.lblDesc.sizeThatFits(CGSize(width: maxWidth, height: CGFloat.max))
self.lblDescriptionHeightConstration.constant = sizeOfLabel.height

Nota: "40" è lo spazio del lato sinistro e destro dello schermo.

Colore del testo evidenziato e evidenziato

Objective-C

UILabel *label = [[UILabel alloc] init];
label.highlighted = YES;
label.highlightedTextColor = [UIColor redColor];

veloce

let label = UILabel()
label.highlighted = true
label.highlightedTextColor = UIColor.redColor()

Swift 3

let label = UILabel()
label.isHighlighted = true
label.highlightedTextColor = UIColor.red


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow