2017-02-18 2 views
2

Ich habe eine Reihe von UILabels in IB erstellt, die alle Text zugeordnet haben. Der Text jedes Labels enthält mehrere Zeilen unterschiedlicher Schriftgrößen und Farben.Ändern Sie nur die Schriftart von AttributedText in Swift

Zur Laufzeit möchte ich in der Lage sein, nur den Schriftnamen dieser Etiketten zu ändern, ohne die vorhandenen Schriftgrößen oder Farben zu ändern.

Ich habe recherchiert und konnte keine direkte Methode finden, um dies zu erreichen. Irgendwelche Ideen?

+0

Mögliches Duplikat [ios swift: Ist es möglich, die Schriftart eines bestimmten Wortes in einem String zu ändern] (http://stackoverflow.com/questions/29165560/ios-swift-is-it - möglich, den Schriftart-Stil eines bestimmten Wort-in-einer-Zeichenfolge zu ändern) –

+0

und http://stackoverflow.com/questions/18365631/example-of-nsattributedstring-with-two -different-font-sizes –

+0

@Sneak: Diese Fragen/Antworten scheinen nicht das Kernproblem anzugehen, die ursprünglichen Attribute intakt zu lassen, wie Schriftfarbe, Schriftgröße usw. – Kashif

Antwort

6

Als erstes müssen Sie den Jargon von Apple verwendet, um zu beschreiben, eine Schrift verstehen:

  • Helvetica ist eine Familie
  • Helvetica Bold, Helvetica Italic, Helvetica Bold Italic, Helvetica Display usw. sind Gesichter
  • Helvetica Bold, 12pt ist eine Schriftart

Was Sie wollen, ist die Schriftfamilie einer zugeschrieben Zeichenfolge ersetzen:

let newAttributedString = NSMutableAttributedString(attributedString: label.attributedText) 

// Enumerate through all the font ranges 
newAttributedString.enumerateAttribute(NSFontAttributeName, in: NSMakeRange(0, newAttributedString.length), options: []) { value, range, stop in 
    guard let currentFont = value as? UIFont else { 
     return 
    } 

    // An NSFontDescriptor describes the attributes of a font: family name, face name, point size, etc. 
    // Here we describe the replacement font as coming from the "Hoefler Text" family 
    let fontDescriptor = currentFont.fontDescriptor.addingAttributes([UIFontDescriptorFamilyAttribute: "Hoefler Text"]) 

    // Ask the OS for an actual font that most closely matches the description above 
    if let newFontDescriptor = fontDescriptor.matchingFontDescriptors(withMandatoryKeys: [UIFontDescriptorFamilyAttribute]).first { 
     let newFont = UIFont(descriptor: newFontDescriptor, size: currentFont.pointSize) 
     newAttributedString.addAttributes([NSFontAttributeName: newFont], range: range) 
    } 
} 

label.attributedText = newAttributedString 

Original (San Francisco):

San Francisco

Replacement (Hoefler Text):

Hoefler Text

-1

Das obige funktioniert gut, aber mit Swift4 und Xcode 9.1 bekam ich eine Anzahl von Warnungen, dass Methodennamen sich geändert hatten. Unten ist das Ergebnis der Anwendung all dieser Warnungen. Sonst habe ich nichts geändert.

let newAttributedString = NSMutableAttributedString(attributedString: label.attributedText!) 

// Enumerate through all the font ranges 
newAttributedString.enumerateAttribute(NSAttributedStringKey.font, in: NSMakeRange(0, newAttributedString.length), options: []) 
{ 
    value, range, stop in 
    guard let currentFont = value as? UIFont else { 
     return 
    } 

    // An NSFontDescriptor describes the attributes of a font: family name, face name, point size, etc. 
    // Here we describe the replacement font as coming from the "Hoefler Text" family 
    let fontDescriptor = currentFont.fontDescriptor.addingAttributes([UIFontDescriptor.AttributeName.family: "Hoefler Text"]) 

    // Ask the OS for an actual font that most closely matches the description above 
    if let newFontDescriptor = fontDescriptor.matchingFontDescriptors(withMandatoryKeys: [UIFontDescriptor.AttributeName.family]).first { 
     let newFont = UIFont(descriptor: newFontDescriptor, size: currentFont.pointSize) 
     newAttributedString.addAttributes([NSAttributedStringKey.font: newFont], range: range) 
    } 
} 

label.attributedText = newAttributedString 
Verwandte Themen