Ändern der Farbe eines bestimmten Textes mit NSMutableAttributedString in Swift

100

Das Problem, das ich habe, ist, dass ich in der Lage sein möchte, die Textfarbe eines bestimmten Textes in einer Textansicht zu ändern. Ich verwende eine verkettete Zeichenfolge und möchte nur die Zeichenfolgen, die ich an den Text von TextView anhänge. Es scheint, dass ich verwenden möchte NSMutableAttributedString, aber ich finde keine Ressourcen, wie ich dies in Swift verwenden kann. Was ich bisher habe, ist ungefähr so:

let string = "A \(stringOne) with \(stringTwo)"
var attributedString = NSMutableAttributedString(string: string)
textView.attributedText = attributedString

Von hier aus weiß ich, dass ich den Bereich von Wörtern finden muss, deren Textfarbe geändert werden muss, und sie dann der zugewiesenen Zeichenfolge hinzufügen muss. Was ich wissen muss, ist, wie man die richtigen Zeichenfolgen aus dem zugeschriebenen String findet und dann ihre Textfarbe ändert.

Da ich eine zu niedrige Bewertung habe, kann ich meine eigene Frage nicht beantworten, aber hier ist die Antwort, die ich gefunden habe

Ich fand meine eigene Antwort, indem ich einen Code aus übersetzte

Ändern Sie die Attribute von Teilzeichenfolgen in einem NSAttributedString

Hier ist das Beispiel für die Implementierung in Swift:

let string = "A \(stringOne) and \(stringTwo)"
var attributedString = NSMutableAttributedString(string:string)

let stringOneRegex = NSRegularExpression(pattern: nameString, options: nil, error: nil)
let stringOneMatches = stringOneRegex.matchesInString(longString, options: nil, range: NSMakeRange(0, attributedString.length))
for stringOneMatch in stringOneMatches {
    let wordRange = stringOneMatch.rangeAtIndex(0)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.nameColor(), range: wordRange)
}

textView.attributedText = attributedString

Da ich die textColor mehrerer Strings ändern möchte, werde ich eine Hilfsfunktion erstellen, um dies zu handhaben. Dies funktioniert jedoch zum Ändern der textColor.

richyrich24
quelle
Wissen Sie, wie es in Objective-C geht? Haben Sie versucht, denselben Code in Swift neu zu schreiben?
Aaron Brager
Hier ist eine wirklich gute Antwort: stackoverflow.com/a/37992022/426571
el_quick

Antworten:

110

Ich sehe, Sie haben die Frage etwas beantwortet, aber um eine etwas präzisere Möglichkeit zu bieten, ohne Regex zur Beantwortung der Titelfrage zu verwenden:

Um die Farbe einer Textlänge zu ändern, müssen Sie den Start- und Endindex der zukünftigen farbigen Zeichen in der Zeichenfolge kennen, z

var main_string = "Hello World"
var string_to_color = "World"

var range = (main_string as NSString).rangeOfString(string_to_color)

Anschließend konvertieren Sie in eine zugeordnete Zeichenfolge und verwenden 'add attribute' mit NSForegroundColorAttributeName:

var attributedString = NSMutableAttributedString(string:main_string)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)

Eine Liste weiterer Standardattribute, die Sie festlegen können, finden Sie in der Apple-Dokumentation

james_alvarez
quelle
20
NSColor ist nur OSX - verwenden Sie UIColor für IOS
Steve O'Connor
1
Was ist, wenn ich var main_string = "Hallo Welt Hallo Welt Hallo Welt" habe und Farbe auf "Welt" in der gesamten Zeichenfolge anwenden muss?
msmq
main_string, string_to_colorUnd rangewurden nie mutiert. Erwägen Sie, sie auf letkonstant zu ändern ?
Cesare
Schöne Lösung. Du hast meinen Tag gerettet.
Sagar Chauhan
106

SWIFT 5

let main_string = "Hello World"
let string_to_color = "World"

let range = (main_string as NSString).range(of: string_to_color)

let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)


txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute

SWIFT 4.2

 let txtfield1 :UITextField!

    let main_string = "Hello World"
    let string_to_color = "World"

    let range = (main_string as NSString).range(of: string_to_color)

    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: range)


    txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
    txtfield1.attributedText = attribute
Kishore Kumar
quelle
Was ist, wenn die Zeichenfolge groß ist und viele doppelte (ähnliche) Wörter enthält? funktioniert range (of: ...)?
Hatim
44

Swift 2.1 Update:

 let text = "We tried to make this app as most intuitive as possible for you. If you have any questions don't hesitate to ask us. For a detailed manual just click here."
 let linkTextWithColor = "click here"

 let range = (text as NSString).rangeOfString(linkTextWithColor)

 let attributedString = NSMutableAttributedString(string:text)
 attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)

 self.helpText.attributedText = attributedString

self.helpTextist eine UILabelSteckdose.

Chris
quelle
1
Oh Chris, du bist mein Held. Ich suche schon lange nach genau diesem Codeblock.
Pan Mluvčí
@chris. Ich möchte nsmutableattributed String in der Textansicht ändern, ist das möglich
Uma Madhavi
Es funktioniert für ein einzelnes Wort. Aber in meiner Zeichenfolge gibt es mehrere Wörter. Es ändert die Farbe, aber dann schreibe ich nach diesem roten Farbwort, dass die Farbe des Wortes auch rot ist. Sie können also jede Lösung geben, wenn Sie haben.
Dhaval Solanki
Danke für Ihre Hilfe!
ssowri1
18

Swift 4.2 und Swift 5 färben Teile der Saite ein.

Eine sehr einfache Möglichkeit, NSMutableAttributedString beim Erweitern des Strings zu verwenden. Dies kann auch verwendet werden, um mehr als ein Wort in der gesamten Zeichenfolge einzufärben.

Fügen Sie eine neue Datei für Erweiterungen hinzu, Datei -> Neu -> Schnelle Datei mit dem Namen zum Beispiel. "NSAttributedString + TextColouring" und fügen Sie den Code hinzu

import UIKit

extension String {
    func attributedStringWithColor(_ strings: [String], color: UIColor, characterSpacing: UInt? = nil) -> NSAttributedString {
        let attributedString = NSMutableAttributedString(string: self)
        for string in strings {
            let range = (self as NSString).range(of: string)
            attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
        }

        guard let characterSpacing = characterSpacing else {return attributedString}

        attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length))

        return attributedString
    }
}

Jetzt können Sie global auf jedem gewünschten Viewcontroller verwenden:

let attributedWithTextColor: NSAttributedString = "Doc, welcome back :)".attributedStringWithColor(["Doc", "back"], color: UIColor.black)

myLabel.attributedText = attributedWithTextColor

Beispiel für die Verwendung von Textfärbung mit Swift 4

Doci
quelle
11

Die Antwort wurde bereits in früheren Beiträgen gegeben, aber ich habe eine andere Art, dies zu tun

Swift 3x:

var myMutableString = NSMutableAttributedString()

myMutableString = NSMutableAttributedString(string: "Your full label textString")

myMutableString.setAttributes([NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: CGFloat(17.0))!
        , NSForegroundColorAttributeName : UIColor(red: 232 / 255.0, green: 117 / 255.0, blue: 40 / 255.0, alpha: 1.0)], range: NSRange(location:12,length:8)) // What ever range you want to give

yourLabel.attributedText = myMutableString

Hoffe das hilft jedem!

Anurag Sharma
quelle
@UmaMadhavi Was genau ist Ihre Anforderung?
Anurag Sharma
Ich möchte Schriftgröße und Schriftfarbe in der Textansicht ändern. Ich bekomme es in nsmutableattributedstring.
Uma Madhavi
@UmaMadhavi checke diesen Link1 und Link2 aus . Es kann hilfreich sein!
Anurag Sharma
Abstürze, wenn keine Schriftart verfügbar ist.
SafeFastExpressive
10

Chris 'Antwort war eine große Hilfe für mich, also habe ich seinen Ansatz verwendet und mich in eine Funktion verwandelt, die ich wiederverwenden kann. Dadurch kann ich einem Teilstring eine Farbe zuweisen und dem Rest der Zeichenfolge eine andere Farbe geben.

static func createAttributedString(fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) -> NSMutableAttributedString
{
    let range = (fullString as NSString).rangeOfString(subString)
    let attributedString = NSMutableAttributedString(string:fullString)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: fullStringColor, range: NSRange(location: 0, length: fullString.characters.count))
    attributedString.addAttribute(NSForegroundColorAttributeName, value: subStringColor, range: range)
    return attributedString
}
Ghostatron
quelle
6

Swift 4.1

NSAttributedStringKey.foregroundColor

Zum Beispiel, wenn Sie die Schriftart in NavBar ändern möchten:

self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedStringKey.font: UIFont.systemFont(ofSize: 22), NSAttributedStringKey.foregroundColor: UIColor.white]
swift2geek
quelle
6

Sie können diese Erweiterung verwenden, über die ich sie teste

schnell 4.2

import Foundation
import UIKit

extension NSMutableAttributedString {

    convenience init (fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) {
           let rangeOfSubString = (fullString as NSString).range(of: subString)
           let rangeOfFullString = NSRange(location: 0, length: fullString.count)//fullString.range(of: fullString)
           let attributedString = NSMutableAttributedString(string:fullString)
           attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: fullStringColor, range: rangeOfFullString)
           attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: subStringColor, range: rangeOfSubString)

           self.init(attributedString: attributedString)
   }

}
Amr wütend
quelle
4

Swift 2.2

var myMutableString = NSMutableAttributedString()

myMutableString = NSMutableAttributedString(string: "1234567890", attributes: [NSFontAttributeName:UIFont(name: kDefaultFontName, size: 14.0)!])

myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.0/255.0, green: 125.0/255.0, blue: 179.0/255.0, alpha: 1.0), range: NSRange(location:0,length:5))

self.lblPhone.attributedText = myMutableString
Sarabjit Singh
quelle
Ich bekomme eine Fehlermeldung, wenn ich das mache. Ich denke du willst das ohne .CGColor.
Björn Roche
@ SarabjitSingh. Wie kann dies für Textansicht möglich sein
Uma Madhavi
@UmaMadhavi ... Sie müssen nur self.textView.attributedText = myMutableString hinzufügen ..... Es wird funktionieren ...
Sarabjit Singh
4

Die einfachste Möglichkeit, Beschriftungen mit unterschiedlichen Stilen wie Farbe, Schriftart usw. zu erstellen, ist die Verwendung der Eigenschaft "Attributed" im Attributes Inspector. Wählen Sie einfach einen Teil des Textes und ändern Sie ihn wie gewünscht

Geben Sie hier die Bildbeschreibung ein

jMelvins
quelle
1
Angenommen, Sie ändern die Saiten nicht programmatisch
Alejandro Cumpa
4

Basierend auf den Antworten, bevor ich eine String-Erweiterung erstellt habe

extension String {

func highlightWordsIn(highlightedWords: String, attributes: [[NSAttributedStringKey: Any]]) -> NSMutableAttributedString {
     let range = (self as NSString).range(of: highlightedWords)
     let result = NSMutableAttributedString(string: self)

     for attribute in attributes {
         result.addAttributes(attribute, range: range)
     }

     return result
    }
}

Sie können die Attribute für den Text an die Methode übergeben

Rufen Sie so an

  let attributes = [[NSAttributedStringKey.foregroundColor:UIColor.red], [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 17)]]
  myLabel.attributedText = "This is a text".highlightWordsIn(highlightedWords: "is a text", attributes: attributes)
Kuzdu
quelle
4

Swift 4.1

Ich habe mich von diesem in Swift 3 geändert

let str = "Welcome "
let welcomeAttribute = [ NSForegroundColorAttributeName: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

Und das in Swift 4.0

let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

zu Swift 4.1

let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey(rawValue: NSForegroundColorAttributeName): UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

Funktioniert gut

niravdesai21
quelle
Dies ändert die gesamte Zeichenfolge? Dies ist für mich am besten lesbar, aber gibt es eine Möglichkeit, nur bestimmte Wörter innerhalb der Zeichenfolge zu ändern, wie dies im OP gefragt wurde.
Moondra
3

schnell 4.2

    let textString = "Hello world"
    let range = (textString as NSString).range(of: "world")
    let attributedString = NSMutableAttributedString(string: textString)

    attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: range)
    self.textUIlable.attributedText = attributedString
Giang
quelle
2

Für alle, die nach " Anwenden einer bestimmten Farbe auf mehrere Wörter im Text " suchen , können wir dies mit NSRegularExpression tun

 func highlight(matchingText: String, in text: String) {
    let attributedString  = NSMutableAttributedString(string: text)
    if let regularExpression = try? NSRegularExpression(pattern: "\(matchingText)", options: .caseInsensitive) {
        let matchedResults = regularExpression.matches(in: text, options: [], range: NSRange(location: 0, length: attributedString.length))
        for matched in matchedResults {
             attributedString.addAttributes([NSAttributedStringKey.backgroundColor : UIColor.yellow], range: matched.range)

        }
        yourLabel.attributedText = attributedString
    }
}

Referenzlink: https://gist.github.com/aquajach/4d9398b95a748fd37e88

cgeek
quelle
Ist es möglich, Ihren Code in der MacOS Cocoa App zu verwenden? Ich habe versucht, es in meinem Kakaoprojekt zu verwenden, aber in cocoa NSTextView ist kein .attributedText enthalten.
CaOs433
2

Dies könnte Arbeit für Sie sein

let main_string = " User not found,Want to review ? Click here"
    let string_to_color = "Click here"

    let range = (main_string as NSString).range(of: string_to_color)

    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.blue , range: range)

    lblClickHere.attributedText = attribute
Davender Verma
quelle
1
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
HMD
2

Mit dieser einfachen Funktion können Sie den Text zuweisen und das ausgewählte Wort markieren.

Sie können die UITextView auch in UILabel usw. ändern .

func highlightBoldWordAtLabel(textViewTotransform: UITextView, completeText: String, wordToBold: String){
    textViewToTransform.text = completeText
    let range = (completeText as NSString).range(of: wordToBold)
    let attribute = NSMutableAttributedString.init(string: completeText)

    attribute.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: 16), range: range)
    attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black , range: range)
    textViewToTransform.attributedText = attribute
}
Dan Entwickler
quelle
1

Um die Farbe der Schriftfarbe zu ändern, wählen Sie zuerst Attribut statt Normal wie im Bild unten

Sie müssen dann den Text im zugeordneten Feld auswählen und dann die Farbschaltfläche auf der rechten Seite der Ausrichtungen auswählen. Dadurch wird die Farbe geändert.

Kingsley Mitchell
quelle
1

Sie können diese Methode verwenden. Ich habe diese Methode in meiner allgemeinen Dienstprogrammklasse implementiert, um global darauf zuzugreifen.

func attributedString(with highlightString: String, normalString: String, highlightColor: UIColor) -> NSMutableAttributedString {
    let attributes = [NSAttributedString.Key.foregroundColor: highlightColor]
    let attributedString = NSMutableAttributedString(string: highlightString, attributes: attributes)
    attributedString.append(NSAttributedString(string: normalString))
    return attributedString
}
nitin.agam
quelle
0

Wenn Sie Swift 3x und UITextView verwenden, funktioniert NSForegroundColorAttributeName möglicherweise nicht (es hat bei mir nicht funktioniert, egal welchen Ansatz ich versucht habe).

Nach einigem Stöbern fand ich eine Lösung.

//Get the textView somehow
let textView = UITextView()
//Set the attributed string with links to it
textView.attributedString = attributedString
//Set the tint color. It will apply to the link only
textView.tintColor = UIColor.red
mcastro
quelle
0

Super einfacher Weg dies zu tun.

let text = "This is a colorful attributed string"
let attributedText = 
NSMutableAttributedString.getAttributedString(fromString: text)
attributedText.apply(color: .red, subString: "This")
//Apply yellow color on range
attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))

Für weitere Informationen klicken Sie hier: https://github.com/iOSTechHub/AttributedString

Ashish Chauhan
quelle
0

Sie müssen die Textansichtsparameter ändern, nicht die Parameter der zugewiesenen Zeichenfolge

textView.linkTextAttributes = [
        NSAttributedString.Key.foregroundColor: UIColor.red,
        NSAttributedString.Key.underlineColor: UIColor.red,
        NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
    ]
Maxvale
quelle
0

Bitte überprüfen Sie Cocoapod Prestyler :

Prestyler.defineRule("$", UIColor.orange)
label.attributedText = "This $text$ is orange".prestyled()
Kruiller
quelle
0
extension String{
// to make text field mandatory * looks
mutating func markAsMandatoryField()-> NSAttributedString{

    let main_string = self
    let string_to_color = "*"
    let range = (main_string as NSString).range(of: string_to_color)
    print("The rang = \(range)")
    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.rgbColor(red: 255.0, green: 0.0, blue: 23.0) , range: range)
     return attribute
}

}}

Verwenden Sie EmailLbl.attributedText = EmailLbl.text! .markAsMandatoryField ()

NSurajit
quelle
0

Sie können als einfache Erweiterung verwenden

extension String{

func attributedString(subStr: String) -> NSMutableAttributedString{
    let range = (self as NSString).range(of: subStr)
    let attributedString = NSMutableAttributedString(string:self)
    attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)
    
    return attributedString
  }
}

myLable.attributedText = fullStr.attributedString(subStr: strToChange)

  
Waliyan
quelle