it-swarm.com.de

Wie erstelle ich eine zugeordnete Zeichenfolge mit Swift?

Ich versuche einen einfachen Kaffeerechner zu erstellen. Ich muss die Kaffeemenge in Gramm anzeigen. Das "g" -Symbol für Gramm muss an meinem UILabel angebracht sein, das ich zur Anzeige der Menge verwende. Die Zahlen im UILabel ändern sich dynamisch mit der Benutzereingabe, aber ich muss am Ende der Zeichenfolge ein kleines "g" hinzufügen, das anders als die Aktualisierungsnummern formatiert ist. Das "g" muss an die Zahlen angehängt werden, damit sich bei Änderung der Zahlengröße und Position das "g" mit den Zahlen bewegt. Ich bin mir sicher, dass dieses Problem bereits gelöst wurde. Ein Link in die richtige Richtung wäre hilfreich, da ich mein kleines Herz gegoogelt habe.

Ich habe in der Dokumentation nach einem attributierten String gesucht und sogar einen "Attributed String Creator" aus dem App Store heruntergeladen, aber der resultierende Code befindet sich in Objective-C und ich verwende Swift. Was für andere Entwickler, die diese Sprache lernen, großartig und wahrscheinlich hilfreich ist, ist ein klares Beispiel für das Erstellen einer benutzerdefinierten Schriftart mit benutzerdefinierten Attributen unter Verwendung einer zugewiesenen Zeichenfolge in Swift. Die Dokumentation dazu ist sehr verwirrend, da es keinen klaren Pfad gibt. Mein Plan ist, die attributierte Zeichenfolge zu erstellen und sie am Ende meiner coffeeAmount-Zeichenfolge hinzuzufügen.

var coffeeAmount: String = calculatedCoffee + attributedText

Dabei ist Berechnungskaffee ein in eine Zeichenfolge konvertiertes Int und "attributedText" ist das Kleinbuchstabe "g" mit angepasster Schriftart, die ich erstellen möchte. Vielleicht gehe ich falsch herum. Jede Hilfe wird geschätzt!

260
dcbenji

 enter image description here

Diese Antwort wurde für Swift 4.2 aktualisiert.

Kurzübersicht

Die allgemeine Form zum Erstellen und Festlegen einer attributierten Zeichenfolge lautet folgendermaßen. Andere übliche Optionen finden Sie unten.

// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) 

// set attributed text on a UILabel
myLabel.attributedText = myAttrString

 Text Color

let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]

 Background Color

let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]

 Font

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]

 enter image description here

let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]

 enter image description here

let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray

let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]

Der Rest dieses Beitrags enthält mehr Details für Interessierte.


Attribute

Zeichenfolgenattribute sind nur ein Wörterbuch in der Form von [NSAttributedString.Key: Any], wobei NSAttributedString.Key der Schlüsselname des Attributs und Any der Wert eines Typs ist. Der Wert kann eine Schrift, eine Farbe, eine Ganzzahl oder etwas anderes sein. Es gibt viele Standardattribute in Swift, die bereits vordefiniert wurden. Zum Beispiel:

  • schlüsselname: NSAttributedString.Key.font, Wert: eine UIFont
  • schlüsselname: NSAttributedString.Key.foregroundColor, Wert: eine UIColor
  • schlüsselname: NSAttributedString.Key.link, Wert: eine NSURL oder NSString

Es gibt viele andere. Siehe diesen Link für mehr. Sie können sogar Ihre eigenen benutzerdefinierten Attribute erstellen:

  • schlüsselname: NSAttributedString.Key.myName, Wert: einige Typ.
    wenn Sie eine Erweiterung machen :

    extension NSAttributedString.Key {
        static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
    }
    

Attribute in Swift erstellen

Sie können Attribute wie jedes andere Wörterbuch deklarieren.

// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.foregroundColor: UIColor.green,
    NSAttributedString.Key.backgroundColor: UIColor.yellow,
    NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]

Beachten Sie die rawValue, die für den Unterstrichstilwert benötigt wurde.

Da Attribute nur Wörterbücher sind, können Sie sie auch erstellen, indem Sie ein leeres Wörterbuch erstellen und dann Schlüssel-Wert-Paare hinzufügen. Wenn der Wert mehrere Typen enthält, müssen Sie Any als Typ verwenden. Hier ist das multipleAttributes-Beispiel von oben, das auf diese Weise neu erstellt wurde:

var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue

Zugeschriebene Zeichenfolgen

Nachdem Sie nun die Attribute verstanden haben, können Sie zugeordnete Zeichenfolgen erstellen.

Initialisierung

Es gibt verschiedene Möglichkeiten, um attributierte Zeichenfolgen zu erstellen. Wenn Sie nur eine schreibgeschützte Zeichenfolge benötigen, können Sie NSAttributedString verwenden. Hier sind einige Möglichkeiten, es zu initialisieren:

// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)

Wenn Sie die Attribute oder den Inhalt der Zeichenfolge später ändern müssen, sollten Sie NSMutableAttributedString verwenden. Die Erklärungen sind sehr ähnlich:

// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()

// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)

Ändern einer Attributzeichenfolge

Als Beispiel erstellen wir die attributierte Zeichenfolge oben in diesem Beitrag.

Erstellen Sie zuerst eine NSMutableAttributedString mit einem neuen Schriftattribut.

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )

Wenn Sie mitarbeiten, setzen Sie die attributierte Zeichenfolge wie folgt auf eine UITextView (oder UILabel):

textView.attributedText = myString

Sie nicht verwenden textView.text.

Hier ist das Ergebnis: 

 enter image description here

Fügen Sie dann eine weitere attributierte Zeichenfolge an, für die keine Attribute festgelegt sind. (Beachten Sie, dass ich, obwohl ich let verwendet habe, um myString oben zu deklarieren, dennoch modifizieren kann, da es sich um eine NSMutableAttributedString handelt. Dies erscheint mir ziemlich unSwiftisch und ich würde mich nicht wundern, wenn sich dies in der Zukunft ändert. Lassen Sie mir einen Kommentar das passiert.)

let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)

 enter image description here

Als nächstes wählen wir einfach das Wort "Strings" aus, das mit dem Index 17 beginnt und eine Länge von 7 hat. Beachten Sie, dass dies eine NSRange und keine Swift Range ist. (Weitere Informationen zu Ranges finden Sie in diese Antwort .) Mit der addAttribute-Methode können wir den Attributschlüsselnamen an der ersten Stelle, den Attributwert an der zweiten Stelle und den Bereich an der dritten Stelle angeben.

var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)

 enter image description here

Zum Schluss fügen wir noch eine Hintergrundfarbe hinzu. Für Abwechslung verwenden wir die addAttributes-Methode (beachten Sie die s). Ich könnte mit dieser Methode mehrere Attribute gleichzeitig hinzufügen, aber ich werde nur noch eines hinzufügen.

myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)

 enter image description here

Beachten Sie, dass sich die Attribute an einigen Stellen überlappen. Durch das Hinzufügen eines Attributs wird ein bereits vorhandenes Attribut nicht überschrieben.

Verbunden

Lesen Sie weiter

849
Suragch

Swift verwendet die gleiche NSMutableAttributedString wie Obj-C. Sie instantiieren es, indem Sie den berechneten Wert als Zeichenfolge übergeben:

var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")

Erstellen Sie nun die attributierte g-Zeichenfolge (heh). Hinweis: UIFont.systemFontOfSize(_) ist jetzt ein fehlgeschlagener Initialisierer, daher muss er vor der Verwendung des Pakets entpackt werden:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)!]
var gString = NSMutableAttributedString(string:"g", attributes:attrs)

Und dann anhängen:

attributedString.appendAttributedString(gString)

Sie können das UILabel dann so einstellen, dass der NSAttributedString folgendermaßen angezeigt wird:

myLabel.attributedText = attributedString
101
NRitH

Swift 4:

let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!, 
                  NSAttributedStringKey.foregroundColor: UIColor.white]
19
Adam Bardon

Xcode 6 Version :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSForegroundColorAttributeName: UIColor.lightGrayColor(), 
            NSFontAttributeName: AttriFont])

Xcode 9.3 Version :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedStringKey.foregroundColor: UIColor.lightGray, 
            NSAttributedStringKey.font: AttriFont])

Xcode 10, iOS 12, Swift 4 :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedString.Key.foregroundColor: UIColor.lightGray, 
            NSAttributedString.Key.font: AttriFont])
17
harthoo

Swift: xcode 6.1

    let font:UIFont? = UIFont(name: "Arial", size: 12.0)

    let attrString = NSAttributedString(
        string: titleData,
        attributes: NSDictionary(
            object: font!,
            forKey: NSFontAttributeName))
16
Vinod Joshi

Ich würde die Verwendung einer Bibliothek für attributierte Strings dringend empfehlen. Es macht es viel einfacher, wenn Sie beispielsweise eine Zeichenfolge mit vier verschiedenen Farben und vier verschiedenen Schriftarten wünschen. Hier ist mein Favorit. Es heißt SwiftyAttributes

Wenn Sie mit SwiftyAttributes einen String mit vier verschiedenen Farben und verschiedenen Schriftarten erstellen möchten:

let Magenta = "Hello ".withAttributes([
    .textColor(.Magenta),
    .font(.systemFont(ofSize: 15.0))
    ])
let cyan = "Sir ".withAttributes([
    .textColor(.cyan),
    .font(.boldSystemFont(ofSize: 15.0))
    ])
let green = "Lancelot".withAttributes([
    .textColor(.green),
    .font(.italicSystemFont(ofSize: 15.0))

    ])
let blue = "!".withAttributes([
    .textColor(.blue),
    .font(.preferredFont(forTextStyle: UIFontTextStyle.headline))

    ])
let finalString = Magenta + cyan + green + blue

finalString würde als anzeigen 

 Shows as image

14
MendyK

Funktioniert gut in der Beta 6

let attrString = NSAttributedString(
    string: "title-title-title",
    attributes: NSDictionary(
       object: NSFont(name: "Arial", size: 12.0), 
       forKey: NSFontAttributeName))
9
Andrey

Swift 2.0

Hier ist ein Beispiel:

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

OR

let stringAttributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 17.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.orangeColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 2.0]
let atrributedString = NSAttributedString(string: "Sample String: Attributed", attributes: stringAttributes)
sampleLabel.attributedText = atrributedString
7
A.G

Attributed Strings unter iOS verwenden Sie am besten, wenn Sie den integrierten Attributed Text Editor im Interface Builder verwenden und unnötige Hardcoding-NSAtrributedStringKeys in Ihren Quelldateien vermeiden.

Sie können später zur Laufzeit dynamisch Platzhalter ersetzen, indem Sie diese Erweiterung verwenden:

extension NSAttributedString {
    func replacing(placeholder:String, with valueString:String) -> NSAttributedString {

        if let range = self.string.range(of:placeholder) {
            let nsRange = NSRange(range,in:valueString)
            let mutableText = NSMutableAttributedString(attributedString: self)
            mutableText.replaceCharacters(in: nsRange, with: valueString)
            return mutableText as NSAttributedString
        }
        return self
    }
}

Fügen Sie eine Storyboard-Beschriftung hinzu, deren Text wie folgt aussieht. 

 enter image description here

Dann aktualisieren Sie den Wert einfach jedes Mal, wenn Sie dies benötigen:

label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)

Stellen Sie sicher, dass Sie den ursprünglichen Wert in initalAttributedString speichern. 

Sie können diesen Ansatz besser verstehen, indem Sie diesen Artikel lesen: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173d

6
Efraim

Ich habe ein Online-Tool erstellt, das Ihr Problem lösen wird! Sie können Ihre Zeichenfolge schreiben und Stile grafisch anwenden. Das Tool gibt Ihnen Objective-C- und Swift-Code zum Generieren dieser Zeichenfolge.

Es ist auch Open Source, also zögern Sie nicht, es zu erweitern und PRs zu senden.

Transformatorwerkzeug

Github

 enter image description here

6
Andres

Swift 4

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

Sie müssen den Rohwert in Swift 4 entfernen

4
Neha

Bei mir haben die oben genannten Lösungen beim Einstellen einer bestimmten Farbe oder Eigenschaft nicht funktioniert. 

Das hat funktioniert: 

let attributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 12.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.darkGrayColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 3.0]

var atriString = NSAttributedString(string: "My Attributed String", attributes: attributes)
4
swennemen
func decorateText(sub:String, des:String)->NSAttributedString{
    let textAttributesOne = [NSAttributedStringKey.foregroundColor: UIColor.darkText, NSAttributedStringKey.font: UIFont(name: "PTSans-Bold", size: 17.0)!]
    let textAttributesTwo = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "PTSans-Regular", size: 14.0)!]

    let textPartOne = NSMutableAttributedString(string: sub, attributes: textAttributesOne)
    let textPartTwo = NSMutableAttributedString(string: des, attributes: textAttributesTwo)

    let textCombination = NSMutableAttributedString()
    textCombination.append(textPartOne)
    textCombination.append(textPartTwo)
    return textCombination
}

//Implementierung

cell.lblFrom.attributedText = decorateText(sub: sender!, des: " - \(convertDateFormatShort3(myDateString: datetime!))")
4
Yogesh Tandel

Swift 2.1 - Xcode 7

let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo", attributes: attributes)
myLabel.attributedText = attrString
3
 let attrString = NSAttributedString (
            string: "title-title-title",
            attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
2

Die Attribute können direkt in Swift 3 eingestellt werden ...

    let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!,
         NSForegroundColorAttributeName : UIColor .white,
         NSTextEffectAttributeName : NSTextEffectLetterpressStyle])

Verwenden Sie dann die Variable in einer beliebigen Klasse mit Attributen

2
Sebastian
extension UILabel{
    func setSubTextColor(pSubString : String, pColor : UIColor){    
        let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);

        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString
    }
}
2

Swift 4.2

extension UILabel {

    func boldSubstring(_ substr: String) {
        guard substr.isEmpty == false,
            let text = attributedText,
            let range = text.string.range(of: substr, options: .caseInsensitive) else {
                return
        }
        let attr = NSMutableAttributedString(attributedString: text)
        let start = text.string.distance(from: text.string.startIndex, to: range.lowerBound)
        let length = text.string.distance(from: range.lowerBound, to: range.upperBound)
        attr.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: self.font.pointSize)],
                           range: NSMakeRange(start, length))
        attributedText = attr
    }
}
1
Debaprio B

Mit der von mir erstellten Bibliothek lässt sich das Problem ganz einfach lösen. Es heißt Atributika.

let calculatedCoffee: Int = 768
let g = Style("g").font(.boldSystemFont(ofSize: 12)).foregroundColor(.red)
let all = Style.font(.systemFont(ofSize: 12))

let str = "\(calculatedCoffee)<g>g</g>".style(tags: g)
    .styleAll(all)
    .attributedString

label.attributedText = str

 768g

Sie finden es hier https://github.com/psharanda/Atributika

1
Pavel Sharanda

Swifter Swift hat eine ziemlich süße Art, dies ohne Arbeit wirklich zu tun. Geben Sie einfach das Muster an, das abgeglichen werden soll, und welche Attribute darauf angewendet werden sollen. Sie sind großartig für eine Menge Dinge, die Sie ausprobieren können.

``` Swift
let defaultGenreText = NSAttributedString(string: "Select Genre - Required")
let redGenreText = defaultGenreText.applying(attributes: [NSAttributedString.Key.foregroundColor : UIColor.red], toRangesMatching: "Required")
``

Wenn Sie mehrere Anwendungsbereiche haben und dies nur für bestimmte Instanzen möchten, funktioniert diese Methode nicht.

Sie können dies in einem Schritt tun, der beim Trennen nur einfacher zu lesen ist.

0
Vrezh Gulyan

Swift 5 und höher

   let attributedString = NSAttributedString(string:"targetString",
                                   attributes:[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
                                               NSAttributedString.Key.font: UIFont(name: "Arial", size: 18.0) as Any])
0
midhun p

Swift 4.x

let attr = [NSForegroundColorAttributeName:self.configuration.settingsColor, NSFontAttributeName: self.configuration.settingsFont]

let title = NSAttributedString(string: self.configuration.settingsTitle,
                               attributes: attr)
0
Das

Swift 3.0 // Attributierte Zeichenfolge erstellen

Definieren Sie Attribute wie

let attributes = [NSAttributedStringKey.font : UIFont.init(name: "Avenir-Medium", size: 13.0)]
0
Sidharth Khanna

Bitte verwenden Sie Prestyler

import Prestyler
...
Prestyle.defineRule("$", UIColor.red)
label.attributedText = "\(calculatedCoffee) $g$".prestyled()
0
Kruiller