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