Risposte:
Modifica: Evidentemente NSAttributedString
lo farà, su iOS 6 e versioni successive. Invece di utilizzare un 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 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 UILabel
e 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 UILabel
del 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à UILabel
e sarei felice di essere smentito!
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 ;
AttributedString
disabilita per esempio l'allineamento del testo dell'etichetta, quindi devi aggiungerlo allo stile di paragrafo.
Puoi controllare l'interlinea nello storyboard:
Da Interface Builder:
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
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).
Questo ragazzo ha creato una classe per ottenere l'altezza della riga (senza usare CoreText, come libreria MTLabel): https://github.com/LemonCake/MSLabel
La cosa migliore che ho trovato è: https://github.com/mattt/TTTAttributedLabel
È una sottoclasse UILabel, quindi puoi semplicemente rilasciarla e quindi modificare l'altezza della linea:
myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Ho trovato librerie di terze parti come questa:
https://github.com/Tuszy/MTLabel
Per essere la soluzione più semplice.
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
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;