attributed ios swift nsmutableattributedstring

ios - Cambiar el color del texto específico usando NSMutableAttributedString en Swift



nsattributedstringkey (11)

Swift 4.1

NSAttributedStringKey.foregroundColor

por ejemplo, si desea cambiar la fuente en NavBar:

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

El problema que estoy teniendo es que quiero poder cambiar el texto del texto de cierto texto en un TextView. Estoy usando una cadena concatenada, y solo quiero las cadenas que agrego en el texto de TextView. Parece que lo que quiero usar es NSMutableAttributedString , pero no encuentro ningún recurso sobre cómo usar esto en Swift. Lo que tengo hasta ahora es algo como esto:

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

Desde aquí sé que necesito encontrar el rango de palabras que necesitan para cambiar su textColor y luego agregarlas a la cadena atribuida. Lo que necesito saber es cómo encontrar las cadenas correctas de atribustring y luego cambiar su textColor.

Como tengo una calificación demasiado baja, no puedo responder mi propia pregunta, pero esta es la respuesta que encontré

Encontré mi propia respuesta al traducir de traducir algún código de

Cambiar atributos de subcadenas en un NSAttributedString

Aquí está el ejemplo de implementación en 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

Como deseo cambiar el textColor de varias cadenas, haré una función auxiliar para manejar esto, pero esto funciona para cambiar textColor.


Basado en las respuestas antes de crear una extensión de cadena

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 } }

Puede pasar los atributos del texto al método

Llamar así

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)


La forma más fácil de etiquetar con un estilo diferente, como el color, la fuente, etc., es usar la propiedad "Atribuido" en Attributes Inspector. Simplemente elige una parte del texto y cámbialo como quieras


La respuesta de Chris fue de gran ayuda para mí, así que utilicé su enfoque y se convirtió en una función que puedo reutilizar. Esto nos permite asignarle un color a una subcadena mientras le damos al resto de la cadena otro color.

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 }


La respuesta ya está dada en publicaciones anteriores, pero tengo una forma diferente de hacerlo

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

Espero que esto ayude a cualquiera!


Si está utilizando Swift 3x y UITextView, tal vez el NSForegroundColorAttributeName no funcionará (no funcionó para mí, sin importar el enfoque que probé).

Entonces, después de cavar un poco, encontré una solución.

//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


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


Swift 4.1

He cambiado desde esto en Swift 3

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

Y esto en Swift 4.0

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

Swift 4.1

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

Funciona bien


Veo que ya ha respondido la pregunta, pero para proporcionar una forma un poco más concisa sin usar expresiones regulares para responder a la pregunta del título:

Para cambiar el color de una longitud de texto, necesita saber el índice inicial y final de los caracteres coloreados en la cadena, por ejemplo:

var main_string = "Hello World" var string_to_color = "World" var range = (main_string as NSString).rangeOfString(string_to_color)

A continuación, conviértalo en cadena atribuida y use ''agregar atributo'' con NSForegroundColorAttributeName:

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

Puede encontrar una lista de atributos estándar adicionales que puede configurar en la documentación de Apple


Actualización de Swift 2.1:

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.helpText es un outlet de UILabel .


SWIFT 3.0

let txtfield1 :UITextField! var 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(NSForegroundColorAttributeName, value: UIColor.red , range: range) txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100)) txtfield1.attributedText = attribute