2010-10-07 10 views

risposta

114

Modifica: Evidentemente NSAttributedString lo farà, su iOS 6 e versioni successive. Invece di utilizzare NSString per impostare il testo dell'etichetta, creare un NSAttributedString, impostare gli attributi su di esso, quindi impostarlo come .attributedText sull'etichetta. Il codice che si desidera sarà qualcosa di simile a questo: vecchio attributedStringWithString

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; 

di NSAttributedString fatto la stessa cosa, ma ora che viene deprecato.

Per ragioni storiche, ecco la mia risposta originale:

Risposta breve: non si può. Per modificare la spaziatura tra le righe di testo, devi creare una sottoclasse di UILabel e arrotolare il tuo drawTextInRect, creare più etichette o utilizzare un carattere diverso (forse uno modificato per un'altezza specifica della linea, vedi la risposta di Phillipe).

Risposta lunga: Nel stampa e mondo online, lo spazio tra le righe di testo è noto come "leader" (che fa rima con 'voce', e viene dal metallo piombo decenni utilizzati fa). Il ruolo principale è una proprietà di sola lettura di UIFont, che è stato ritirato in 4.0 e sostituito da lineHeight. Per quanto ne so, non c'è modo di creare un font con un set specifico di parametri come lineHeight; ottieni i font di sistema e qualsiasi font personalizzato che aggiungi, ma non puoi modificarli una volta installato.

Non esiste alcun parametro di spaziatura in UILabel.

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

Mi piacerebbe che fosse maggiore flessibilità in UILabel e sarei felice di essere smentito!

+1

ho fatto con sub-classing UILabel, sostanzialmente idea è quella di dividere testo dell'etichetta in token, e poi la lunghezza identità di ogni token, creare un'etichetta separata per ogni token e aggiungere uno dopo l'altro. Questo è tutto. – Matrix

+3

Bugie! ;) È possibile correggere un file di font per modificare l'altezza della linea - vedere la mia risposta su questa pagina. – Philippe

+0

Sono [portato a credere] (http://stackoverflow.com/a/8162907/1167833) c'è un modo per farlo con NSAttributedString. Se hai bisogno di etichette con stringhe attribuite in pre iOS 6, consulta [OHAttributoLabel] (https://github.com/AliSoftware/OHAttributoLabel). –

15

La mia soluzione era quella di patchare il file del font stesso e fissare la sua altezza della linea sicuramente. 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).

+0

Super cool! Questi strumenti per font OS X hanno funzionato anche con il mio font OTF (sebbene specifichi solo TTF ...). Il mio font aveva altezza riga 1000 (!), L'ho cambiato a 0 e voilà.Avevo miglia e miglia di spazio vuoto sotto il testo su ogni linea. – 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] (http://www.cr8software.net/typelight.html) (e in Font | Metrics | Advanced puoi modificare lineGap) per modificare i miei font. Permette anche di "rinominare" i caratteri, che non sono riuscito a capire come utilizzare lo strumento che Philippe ha menzionato. –

+0

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

74

partire in iOS 6 è possibile impostare una stringa attribuito nel UILabel:

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! aggiungerei che l'uso di 'AttributedString' disabilita l'allineamento del testo dell'etichetta di esempio, quindi devi aggiungerlo allo stile di paragrafo. – cyborg86pl

+0

grazie, mi hai salvato la vita! –

7

La cosa migliore che ho trovato è: https://github.com/mattt/TTTAttributedLabel

E 'una sottoclasse UILabel così si può semplicemente cadere, e poi per modificare l'altezza della linea:

myLabel.lineHeightMultiple = 0.85; 
myLabel.leading = 2; 
+0

myLabel.leading = 2; non funziona –

46

È possibile controllare la spaziatura tra le righe nello storyboard:

duplicate question

+10

Tuttavia in Xcode 6.1.1 selezionare l'etichetta e modificare il valore della linea 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

Thumbs up per l'animazione – Tieme

+1

Nella versione 7.1, il pannello si sposta e non ha alcun effetto sul tempo di esecuzione. Dovevo farlo in codice. – ByteArtisan

0

Naturalmente, la risposta di Mike non funziona se si passa la stringa di codice. In questo caso è necessario passare una stringa attribuita e cambiarne 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; 
1

Ecco alcuni swift-codice per voi di impostare la spaziatura tra le righe di codice

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 
7

Da Interface Builder:

enter image description here

di programmazione:

Swift 4

Utilizzando estensione in

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 chiamare 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 utilizzando esempio etichetta (Basta copiare & eseguire questo codice per vedere 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