Imposta l'interlinea UILabel


Risposte:


122

Modifica: Evidentemente NSAttributedStringlo farà, su iOS 6 e versioni successive. Invece di utilizzare un NSStringper impostare il testo dell'etichetta, creare un NSAttributedString, impostare gli attributi su di esso, quindi impostarlo come .attributedTextsull'etichetta. Il codice che desideri sarà qualcosa del genere:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

Vecchio attributedStringWithString di NSAttributedString fatto la stessa cosa, ma ora che è stato deprecato.

Per ragioni storiche, ecco la mia risposta originale:

Risposta breve: non puoi. Per modificare la spaziatura tra le righe di testo, dovrai creare una sottoclasse UILabele rotolare la tua drawTextInRect, creare più etichette o utilizzare un carattere diverso (forse uno modificato per un'altezza di riga specifica, vedi la risposta di Phillipe).

Risposta lunga: nel mondo della stampa e online, lo spazio tra le righe di testo è noto come "leading" (fa rima con "intestazione" e deriva dal piombo usato decenni fa). Leading è una proprietà di sola lettura di UIFont, che è stata deprecata nella 4.0 e sostituita da lineHeight. Per quanto ne so, non c'è modo di creare un carattere con un insieme specifico di parametri come lineHeight; ottieni i caratteri di sistema e qualsiasi carattere personalizzato che aggiungi, ma non puoi modificarli una volta installati.

Non ci sono nemmeno parametri di spaziatura UILabel.

Non sono particolarmente soddisfatto UILabeldel comportamento di così com'è, quindi suggerisco di scrivere la tua sottoclasse o di utilizzare una libreria di terze parti. Ciò renderà il comportamento indipendente dalla scelta del carattere e sarà la soluzione più riutilizzabile.

Vorrei che ci fosse più flessibilità UILabele sarei felice di essere smentito!


1
L'ho fatto con la sottoclasse UILabel, fondamentalmente l'idea è di dividere il testo dell'etichetta in token, quindi la lunghezza dell'identità di ciascun token, creare un'etichetta separata per ogni token e aggiungerli uno dopo l'altro. Questo è tutto.
Matrix

3
Bugie! ;) Puoi patchare un file di font per cambiare l'altezza della linea - vedi la mia risposta su questa pagina.
Philippe

Sono portato a credere che ci sia un modo per farlo con NSAttributedString. Se hai bisogno di etichette con stringhe attribuite in versioni precedenti a iOS 6, controlla OHAttributedLabel .
Spencer Williams,

Fallo con NSAttributesString se usi iOS> = 6. Esempio
d.ennis

Questo è semplice e funziona bene.
R. Mohan

75

A partire da ios 6 puoi impostare una stringa attribuita nell'etichetta UIL:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;

1
Grazie! Lo aggiungerei usando AttributedStringdisabilita per esempio l'allineamento del testo dell'etichetta, quindi devi aggiungerlo allo stile di paragrafo.
cyborg86pl

56

Puoi controllare l'interlinea nello storyboard:

domanda duplicata


10
Tuttavia in Xcode 6.1.1 la selezione dell'etichetta e la modifica del valore della riga nel pannello attribuito causerà lo sfarfallio del pannello e il blocco dell'applicazione. Sono stato in grado di uscire dal pannello solo chiudendo forzatamente Xcode.
izk

4
Complimenti per l'animazione
Tieme

1
Nella versione 7.1 il pannello si muove rapidamente e non ha alcun effetto sul tempo di esecuzione. Ho dovuto farlo in codice.
MiguelSlv

L'elettricità da 440 watt attraversava il mio pannello proprio ora;)
Sarasranglt

23

Da Interface Builder:

inserisci qui la descrizione dell'immagine

livello di programmazione:

SWift 4

Utilizzo dell'estensione dell'etichetta

extension UILabel {

    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

Ora chiama la funzione di estensione

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0


O usando l'istanza dell'etichetta (basta copiare ed eseguire questo codice per vedere il risultato)

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

Swift 3

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString

È necessario superare solo una linea di argomentazione Spaziatura o altezza di linea multipla, non è possibile superare entrambe le argomentazioni in altro modo nessun risultato arriverà, penso
Arpit B Parekh

16

La mia soluzione è stata quella di correggere il file del carattere stesso e correggere definitivamente l'altezza della linea. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

Ho dovuto modificare "lineGap", "ascender", "descender" nel blocco "hhea" (come nell'esempio del blog).


Super cool! Quegli strumenti per i font OS X hanno funzionato anche per il mio font OTF (sebbene specifichi solo TTF ...). Il mio carattere aveva un'altezza di riga 1000 (!), L'ho cambiato in 0 e voilà. Avevo miglia e miglia di spazio vuoto sotto il testo su ogni riga.
Jonny

2
Non posso credere che questa sia la soluzione migliore (senza offesa!), Ma è di gran lunga la più semplice. Ho usato il software gratuito (Windows) Type Light (e in Font | Metrics | Advanced puoi modificare lineGap) per modificare i miei caratteri. Ti permette anche di "rinominare" i caratteri, cosa che non sono riuscito a capire come fare usando lo strumento citato da Philippe.
Kirk Woll

Questo è fantastico @Philippe! Grazie per il post!!
Robbie

Si veda anche la mia risposta a una domanda simile per ulteriori specifiche: stackoverflow.com/a/19553827/201828
phatmann

@iamjustaprogrammer È di nuovo online.
Matt B.




2

Ecco un po 'di codice rapido per impostare la spaziatura delle righe a livello di programmazione

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText

0

Ovviamente, la risposta di Mike non funziona se passi la stringa a livello di programmazione. In questo caso è necessario passare una stringa attribuita e modificarne lo stile.

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;
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.