Come controllare l’interlinea in UILabel

È ansible ridurre il divario tra il testo quando si inseriscono più righe in un UILabel ? Possiamo impostare la cornice, la dimensione del carattere e il numero di linee. Voglio ridurre il divario tra le due linee in quell’etichetta.

Ho pensato di aggiungere qualcosa di nuovo a questa risposta, quindi non mi sento così male … Ecco una risposta rapida :

 import Cocoa let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 40 let attrString = NSMutableAttributedString(string: "Swift Answer") attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length)) var tableViewCell = NSTableCellView() tableViewCell.textField.attributedStringValue = attrString 

“Risposta breve: non puoi. Per modificare la spaziatura tra le righe di testo, dovrai sottoclassi UILabel e arrotolerai il tuo drawTextInRect, o creerai più etichette.”

Vedi: Imposta l’interlinea UILabel


Questa è una risposta molto vecchia, e altri hanno già aggiunto il nuovo e migliore modo di gestirlo. Vedi le risposte aggiornate fornite di seguito.

In Xcode 6 puoi farlo nello storyboard:

inserisci la descrizione dell'immagine qui

A partire da iOS 6 è ansible impostare una stringa attribuita a UILabel. Controlla quanto segue:

 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = spacing; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)]; label.attributedText = attributedString; 

Le soluzioni indicate qui non hanno funzionato per me. Ho trovato un modo leggermente diverso di farlo con iOS 6 NSAttributeString:

 myLabel.numberOfLines = 0; NSString* string = @"String with line one. \n Line two. \n Line three."; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; style.minimumLineHeight = 30.f; style.maximumLineHeight = 30.f; NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,}; myLabel.attributedText = [[NSAttributedString alloc] initWithString:string attributes:attributtes]; [myLabel sizeToFit]; 

Ho realizzato questa semplice estensione che funziona molto bene per me:

 extension UILabel { func setLineHeight(lineHeight: CGFloat) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = lineHeight paragraphStyle.alignment = self.textAlignment let attrString = NSMutableAttributedString() if (self.attributedText != nil) { attrString.append( self.attributedText!) } else { attrString.append( NSMutableAttributedString(string: self.text!)) attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length)) } attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length)) self.attributedText = attrString } } 

Copia questo in un file, quindi puoi usarlo in questo modo

 myLabel.setLineHeight(0.7) 

C’è una risposta alternativa ora in iOS 6, che è quella di impostare attribuitoText sull’etichetta, utilizzando un NSAttributedString con gli stili di paragrafo appropriati. Visualizza questa risposta di overflow dello stack per i dettagli sull’altezza della riga con NSAttributedString:

Core Text – NSAttributoL’altezza della linea di costruzione eseguita correttamente?

Da Interface Builder (Storyboard / XIB):

inserisci la descrizione dell'immagine qui

livello di programmazione:

SWift 4

Utilizzando l’estensione dell’etichetta

 extension UILabel { // Pass value for any one of both parameters and see result 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 (copia e esegui questo codice per vedere il risultato)

 let label = UILabel() let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel" 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 = "How to\ncontrol\nthe\nline spacing\nin UILabel" 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 

Ecco una class che sottoclass UILabel per avere la proprietà line-height: https://github.com/LemonCake/MSLabel

In Swift e come funzione, ispirato a DarkDust

 // Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20) func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineSpacing let attrString = NSMutableAttributedString(string: text) attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length)) label.attributedText = attrString } 

Secondo la risposta di @Mike, ridurre la lineHeightMultiple è il punto chiave. Esempio di seguito, funziona bene per me:

  NSString* text = label.text; CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width; if (textWidth > label.frame.size.width) { NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]; paragraph.alignment = NSTextAlignmentCenter; paragraph.lineSpacing = 1.0f; paragraph.lineHeightMultiple = 0.75; // Reduce this value !!! NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text]; [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)]; label.attributedText = attrText; } 

SWIFT 3 estensione utile per impostare lo spazio tra le linee più facilmente 🙂

 extension UILabel { func setLineHeight(lineHeight: CGFloat) { let text = self.text if let text = text { let attributeString = NSMutableAttributedString(string: text) let style = NSMutableParagraphStyle() style.lineSpacing = lineHeight attributeString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSMakeRange(0, text.characters.count)) self.attributedText = attributeString } } } 

In Swift 2.0 …

Aggiungi un’estensione:

 extension UIView { func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] { let titleParagraphStyle = NSMutableParagraphStyle() titleParagraphStyle.lineHeightMultiple = lineHeightMultiple let attribute = [ NSForegroundColorAttributeName: color, NSKernAttributeName: kern, NSFontAttributeName : UIFont(name: font, size: fontSize)!, NSParagraphStyleAttributeName: titleParagraphStyle ] return attribute } } 

Ora, imposta semplicemente UILabel come attribuito Testo:

 self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5)) 

Ovviamente, ho aggiunto una serie di parametri che potresti non aver bisogno. Gioca in giro – sentiti libero di riscrivere il metodo – stavo cercando questo su un sacco di risposte diverse, quindi ho pensato di postare l’intera estensione nel caso in cui aiuti qualcuno là fuori … -rab

Swift3 – In un’estensione UITextView o UILabel, aggiungi questa funzione:

Ho aggiunto del codice per mantenere il testo attribuito corrente se stai già usando le string attribuite con la vista (invece di sovrascriverle).

 func setLineHeight(_ lineHeight: CGFloat) { guard let text = self.text, let font = self.font else { return } let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = lineHeight paragraphStyle.alignment = self.textAlignment var attrString:NSMutableAttributedString if let attributed = self.attributedText { attrString = NSMutableAttributedString(attributedString: attributed) } else { attrString = NSMutableAttributedString(string: text) attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length)) } attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length)) self.attributedText = attrString } 

Un’altra risposta … Se passi la stringa a livello di programmazione, devi passare una stringa attribuita invece di una stringa normale e cambiarne lo stile. (IOS10)

 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; 

Ho trovato un modo in cui è ansible impostare l’ altezza della linea reale (non un fattore) e rende addirittura live in Interface Builder . Segui le istruzioni qui sotto. Il codice è scritto in Swift 4 .


Passaggio 1: creare un file denominato DesignableLabel.swift e inserire il seguente codice:

 import UIKit @IBDesignable class DesignableLabel: UILabel { @IBInspectable var lineHeight: CGFloat = 20 { didSet { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.minimumLineHeight = lineHeight paragraphStyle.maximumLineHeight = lineHeight paragraphStyle.alignment = self.textAlignment let attrString = NSMutableAttributedString(string: text!) attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length)) attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length)) attributedText = attrString } } } 

Passaggio 2: posizionare un UILabel in uno storyboard / XIB e impostare la class su DesignableLabel . Aspetta che il tuo progetto venga compilato (la build deve avere successo!).

Specifica della classe sul tuo UILabel


Passo 3: Ora dovresti vedere una nuova proprietà nel pannello delle proprietà chiamato “Altezza della linea”. Basta impostare il valore che ti piace e dovresti vedere immediatamente i risultati!

Imposta l'altezza della linea nelle proprietà

Questo codice ha funzionato per me (ios 7 e ios 8 di sicuro).

 _label.numberOfLines=2; _label.textColor=[UIColor whiteColor]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineHeightMultiple=0.5; paragraphStyle.alignment = NSTextAlignmentCenter; paragraphStyle.lineSpacing = 1.0; NSDictionary *nameAttributes=@{ NSParagraphStyleAttributeName : paragraphStyle, NSBaselineOffsetAttributeName:@2.0 }; NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes]; _label.attributedText=string; 

Estensione Swift 3:

  import UIKit extension UILabel { func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineHeightMultiple = lineHeightMultiply paragraphStyle.alignment = .center let attributedString = NSMutableAttributedString(string: text) attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length)) self.attributedText = attributedString } } 

Questo dovrebbe aiutare con esso. È quindi ansible assegnare l’etichetta a questa class personalizzata all’interno dello storyboard e utilizzarne i parametri direttamente all’interno delle proprietà:

 open class SpacingLabel : UILabel { @IBInspectable open var lineHeight:CGFloat = 1 { didSet { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = self.lineHeight paragraphStyle.alignment = self.textAlignment let attrString = NSMutableAttributedString(string: self.text!) attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length)) attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length)) self.attributedText = attrString } } } 

Ecco una sottoclass di UILabel che imposta lineHeightMultiple e assicura che l’altezza intrinseca sia sufficientemente ampia da non tagliare il testo.

 @IBDesignable class Label: UILabel { override var intrinsicContentSize: CGSize { var size = super.intrinsicContentSize let padding = (1.0 - lineHeightMultiple) * font.pointSize size.height += padding return size } override var text: String? { didSet { updateAttributedText() } } @IBInspectable var lineHeightMultiple: CGFloat = 1.0 { didSet { updateAttributedText() } } private func updateAttributedText() { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineHeightMultiple = lineHeightMultiple attributedText = NSAttributedString(string: text ?? "", attributes: [ .font: font, .paragraphStyle: paragraphStyle, .foregroundColor: textColor ]) invalidateIntrinsicContentSize() } } 

Estensione etichetta Swift 4. Creare NSMutableAttributedString prima di passare alla funzione nel caso in cui siano richiesti attributi aggiuntivi per il testo attribuito.

 extension UILabel { func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = 1.0 paragraphStyle.lineHeightMultiple = height paragraphStyle.alignment = textAlignment attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1)) self.attributedText = attributedText } } 

Ecco la mia soluzione in rapida. La sottoclass dovrebbe funzionare sia per attribuitoText e proprietà text e per characterSpacing + lineSpacing. Mantiene la spaziatura se viene impostata una nuova stringa o una stringa attribuita.

 open class UHBCustomLabel : UILabel { @IBInspectable open var characterSpacing:CGFloat = 1 { didSet { updateWithSpacing() } } @IBInspectable open var lines_spacing:CGFloat = -1 { didSet { updateWithSpacing() } } open override var text: String? { set { super.text = newValue updateWithSpacing() } get { return super.text } } open override var attributedText: NSAttributedString? { set { super.attributedText = newValue updateWithSpacing() } get { return super.attributedText } } func updateWithSpacing() { let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!) attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length)) if lines_spacing >= 0 { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lines_spacing paragraphStyle.alignment = textAlignment attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length)) } super.attributedText = attributedString } } 

Come soluzione alternativa rapida-sporca-intelligente:

Per UILabels che non ha molte linee puoi invece usare stackView.

  1. Per ogni riga scrivi una nuova etichetta.
  2. Incorporali in uno StackView (seleziona entrambe le etichette -> Editor -> Incorpora in -> StackView
  3. Regolare la Spacing di StackView sulla quantità desiderata

Assicurati di impilarli verticalmente . Questa soluzione funziona anche per i caratteri personalizzati.

inserisci la descrizione dell'immagine qui