2017-09-12 3 views
3

J'ai besoin de définir deux attributs à un texte présenté par un UILabel: l'espacement entre les lettres (kern), et son style barré. Sur la base de la documentation NSAttributedStringKey j'ai créé l'extension suivante à la UILabel:Comment définir l'espacement entre les caractères (kern) et le style barré pour `UILabel`?

extension UILabel { 
    func setStrikeThroughSpacedText(text: String, kern: CGFloat?) { 
     var attributes: [NSAttributedStringKey : Any] = [:] 
     if let kern = kern { 
      attributes[.kern] = kern 
     } 
     attributes[.strikethroughStyle] 
        = NSNumber(integerLiteral: NSUnderlineStyle.styleSingle.rawValue) 
     self.attributedText = NSAttributedString(string: text, 
               attributes: attributes) 
    } 
} 

Cependant, il semble que .kern clé entre en collision en quelque sorte avec la clé .strikethroughStyle, parce que si je précise kern, le kern est appliqué, mais pas le style barré. Si je ne spécifie pas kern (donc l'extension n'applique pas l'attribut .kern), le style barré fonctionne.

Quelqu'un a une manière différente de contourner ce bug (je suppose que c'est un bug)?

+1

Ceci, en effet, semble être un bug. Avez-vous déposé un radar? – the4kman

+0

pas encore .. bien que je viens de le tester en simulateur sur iOS 11 et il semble y travailler .. il semble donc qu'ils l'ont réparé là .. –

+0

Voir une réponse mise à jour avec le résultat. – Krunal

Répondre

2

Essayez ceci, cela devrait fonctionner pour vous
Note: Je l'ai testé dans Swift 4

let label = UILabel() 
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel" 
let attrString = NSMutableAttributedString(string: stringValue) 
let 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(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.count)) 
attrString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: 2, range: NSMakeRange(0, attrString.length)) 
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length)) 
label.attributedText = attrString 


Résultat:
Sim 1: Frappe + LineSpacing
Sim 2: grève + Espacement des lignes + Espacement des caractères

enter image description here

+1

L'attribut '.kern' définit l'espacement des caractères, pas l'interligne –

+0

cela fonctionne dans iOS 11, mais pas dans iOS 10 .. c'est le problème .. –

+0

Essayez avec Xcode 9 (Swift 4) et iOS 10 simulateur. (Vous utilisez peut-être Xcode 8 avec Swift 3) – Krunal