¡Acabo de agregar su extensión a mi proyecto! ¡Gracias!
Zeb
Buena categoría para UILabel. Muchas gracias. Esta debería ser la respuesta aceptada.
Pradeep Reddy Kypa
63
He hecho esto creando un categoryforNSMutableAttributedString
-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color
{NSRange range =[self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];if(range.location !=NSNotFound){[self addAttribute:NSForegroundColorAttributeNamevalue:color range:range];}}
Úselo como
-(void) setColoredLabel
{NSMutableAttributedString*string=[[NSMutableAttributedString alloc] initWithString:@"Here is a red blue and green text"];[string setColorForText:@"red" withColor:[UIColor redColor]];[string setColorForText:@"blue" withColor:[UIColor blueColor]];[string setColorForText:@"green" withColor:[UIColor greenColor]];
mylabel.attributedText =string;}
func setColoredLabel(){letstring=NSMutableAttributedString(string:"Here is a red blue and green text")string.setColorForText("red",with:#colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1))string.setColorForText("blue",with:#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1))string.setColorForText("green",with:#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1))
mylabel.attributedText =string}
SWIFT 4 @ kj13 Gracias por notificarnos
// If no text is send, then the style will be applied to full text
func setColorForText(_ textToFind:String?,with color:UIColor){let range:NSRange?iflet text = textToFind{
range =self.mutableString.range(of: text, options:.caseInsensitive)}else{
range =NSMakeRange(0,self.length)}if range!.location !=NSNotFound{
addAttribute(NSAttributedStringKey.foregroundColor,value: color, range: range!)}}
He hecho más experimentos con atributos y a continuación están los resultados, aquí está el SOURCECODE
Necesita crear una nueva categoría para NSMutableAttributedString con el método ... de todos modos agregué esta muestra a github, puede tomarla
anoop4real
Pero necesito establecer el color de todo el alfabeto con incasesensitive en una cadena ... como toda "e" en color rojo de toda la cadena
Ravi Ojha
Sin @interface visible para 'NSMutableAttributedString' declara el selector 'setColorForText: withColor:'
ekashking
1
Recibí el error 'Uso del identificador no resuelto' NSForegroundColorAttributeName 'con Swift4.1, pero reemplazo' NSForegroundColorAttributeName 'por' NSAttributedStringKey.foregroundColor 'y construyo correctamente.
kj13
1
@ kj13 Gracias por notificarme, actualicé la respuesta y agregué algunos estilos más
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";NSString*myString =@"Not a member?signin";//Create mutable string from original oneNSMutableAttributedString*attString =[[NSMutableAttributedString alloc] initWithString:myString];//Fing range of the string you want to change colour//If you need to change colour in more that one place just repeat itNSRange range =[myString rangeOfString:@"signin"];[attString addAttribute:NSForegroundColorAttributeNamevalue:[UIColor colorWithRed:(63/255.0) green:(163/255.0) blue:(158/255.0) alpha:1.0] range:range];//Add it to the label - notice its not text property but it's attributeText
_label.attributedText = attString;
Solo necesita construir su NSAttributedString. Básicamente, hay dos formas:
Agregue fragmentos de texto con los mismos atributos: para cada parte, cree una NSAttributedStringinstancia y añádalas a unaNSMutableAttributedString
Cree texto con atributos a partir de una cadena simple y luego agregue atributos para rangos dados: busque el rango de su número (o lo que sea) y aplique un atributo de color diferente en eso.
Tener un UIWebView o más de un UILabel podría considerarse excesivo para esta situación.
Mi sugerencia sería usar TTTAttributedLabel, que es un reemplazo directo de UILabel que admite NSAttributedString . Esto significa que puede aplicar muy fácilmente diferentes estilos a diferentes rangos en una cadena.
Para mostrar texto corto con formato que no necesita ser editable, Core Text es el camino a seguir. Hay varios proyectos de código abierto para etiquetas que utilizan NSAttributedStringy Core Text para renderizar. Consulte CoreTextAttributedLabel u OHAttributedLabel, por ejemplo.
JTAttributedLabel (por mystcolor) le permite usar el soporte de cadenas atribuidas en UILabel bajo iOS 6 y al mismo tiempo su clase JTAttributedLabel bajo iOS 5 a través de su JTAutoLabel.
Hola, ¿cómo hago esto si quiero agregar dos cadenas de colores diferentes? Intenté usar su ejemplo y agregar otro, pero todavía solo colorea uno de ellos ..
Erik Auranaune
Pruebe esto: let colorString = "(cadena en rojo)" let colorStringGreen = "(cadena en verde)" self.mLabel.text = "color clásico" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: UIColor .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
Un problema es que si las dos cadenas son iguales, solo colorea una de ellas, mira aquí: pastebin.com/FJZJTpp3 . ¿También tienes una solución para esto?
Erik Auranaune
2
Swift 4 y superior: inspirada en la solución de anoop4real , aquí hay una extensión de cadena que se puede usar para generar texto con 2 colores diferentes.
Mi respuesta también tiene la opción de colorear todas las ocurrencias de un texto, no solo una ocurrencia del mismo: "wa ba wa ba dubdub", puede colorear todas las ocurrencias de wa no solo la primera ocurrencia como la respuesta aceptada.
extension NSMutableAttributedString{
func setColorForText(_ textToFind:String,with color:UIColor){let range =self.mutableString.range(of: textToFind, options:.caseInsensitive)if range.location !=NSNotFound{
addAttribute(NSForegroundColorAttributeName,value: color, range: range)}}
func setColorForAllOccuranceOfText(_ textToFind:String,with color:UIColor){let inputLength =self.string.count
let searchLength = textToFind.count
var range =NSRange(location:0, length:self.length)while(range.location !=NSNotFound){
range =(self.stringasNSString).range(of: textToFind, options:[], range: range)if(range.location !=NSNotFound){self.addAttribute(NSForegroundColorAttributeName,value: color, range:NSRange(location: range.location, length: searchLength))
range =NSRange(location: range.location + range.length, length: inputLength -(range.location + range.length))}}}}
Ahora puedes hacer esto:
let message =NSMutableAttributedString(string:"wa ba wa ba dubdub")
message.setColorForText(subtitle,with:UIColor.red)// or the below one if you want all the occurrence to be colored
message.setColorForAllOccuranceOfText("wa",with:UIColor.red)// then you set this attributed string to your label :
lblMessage.attributedText = message
Para los usuarios de Xamarin , tengo un método C # estático en el que paso una matriz de cadenas, una matriz de UIColours y una matriz de UIFonts (deberán coincidir en longitud). Luego, la cadena atribuida se devuelve.
ver:
publicstaticNSMutableAttributedStringGetFormattedText(string[] texts,UIColor[] colors,UIFont[] fonts){NSMutableAttributedString attrString =newNSMutableAttributedString(string.Join("", texts));int position =0;for(int i =0; i < texts.Length; i++){
attrString.AddAttribute(newNSString("NSForegroundColorAttributeName"), colors[i],newNSRange(position, texts[i].Length));var fontAttribute =newUIStringAttributes{Font= fonts[i]};
attrString.AddAttributes(fontAttribute,newNSRange(position, texts[i].Length));
position += texts[i].Length;}return attrString;}
En mi caso, estoy usando Xcode 10.1. Existe la opción de cambiar entre texto sin formato y texto atribuido en el texto de la etiqueta en Interface Builder
Parece que XCode 11.0 rompió el editor de texto atribuido. Entonces, intenté usar TextEdit para crear el texto, luego lo pegué en Xcode y funcionó sorprendentemente bien.
Respuestas:
La forma de hacerlo es usar
NSAttributedString
así:Creé una
UILabel
extensión para hacerlo .fuente
He hecho esto creando un
category
forNSMutableAttributedString
Úselo como
SWIFT 3
USO
SWIFT 4 @ kj13 Gracias por notificarnos
He hecho más experimentos con atributos y a continuación están los resultados, aquí está el SOURCECODE
Aqui esta el resultado
fuente
Aqui tienes
fuente
Rápido 4
Resultado
Swift 3
Resultado:
fuente
fuente
Desde iOS 6 , UIKit admite el dibujo de cadenas atribuidas, por lo que no se necesita extensión ni reemplazo.
De
UILabel
:Solo necesita construir su
NSAttributedString
. Básicamente, hay dos formas:Agregue fragmentos de texto con los mismos atributos: para cada parte, cree una
NSAttributedString
instancia y añádalas a unaNSMutableAttributedString
Cree texto con atributos a partir de una cadena simple y luego agregue atributos para rangos dados: busque el rango de su número (o lo que sea) y aplique un atributo de color diferente en eso.
fuente
Anups responde rápidamente. Se puede reutilizar de cualquier clase.
En archivo rápido
En algún controlador de vista
fuente
Tener un UIWebView o más de un UILabel podría considerarse excesivo para esta situación.
Mi sugerencia sería usar TTTAttributedLabel, que es un reemplazo directo de UILabel que admite NSAttributedString . Esto significa que puede aplicar muy fácilmente diferentes estilos a diferentes rangos en una cadena.
fuente
Para mostrar texto corto con formato que no necesita ser editable, Core Text es el camino a seguir. Hay varios proyectos de código abierto para etiquetas que utilizan
NSAttributedString
y Core Text para renderizar. Consulte CoreTextAttributedLabel u OHAttributedLabel, por ejemplo.fuente
NSAttributedString
es el camino a seguir. La siguiente pregunta tiene una gran respuesta que le muestra cómo hacerlo. ¿Cómo se usa NSAttributedString?fuente
JTAttributedLabel (por mystcolor) le permite usar el soporte de cadenas atribuidas en UILabel bajo iOS 6 y al mismo tiempo su clase JTAttributedLabel bajo iOS 5 a través de su JTAutoLabel.
fuente
Existe una solución Swift 3.0
Y hay un ejemplo de llamada:
fuente
Swift 4 y superior: inspirada en la solución de anoop4real , aquí hay una extensión de cadena que se puede usar para generar texto con 2 colores diferentes.
El siguiente ejemplo cambia el color del asterisco a rojo y conserva el color de la etiqueta original para el texto restante.
fuente
Mi respuesta también tiene la opción de colorear todas las ocurrencias de un texto, no solo una ocurrencia del mismo: "wa ba wa ba dubdub", puede colorear todas las ocurrencias de wa no solo la primera ocurrencia como la respuesta aceptada.
Ahora puedes hacer esto:
fuente
Para los usuarios de Xamarin , tengo un método C # estático en el que paso una matriz de cadenas, una matriz de UIColours y una matriz de UIFonts (deberán coincidir en longitud). Luego, la cadena atribuida se devuelve.
ver:
fuente
En mi caso, estoy usando Xcode 10.1. Existe la opción de cambiar entre texto sin formato y texto atribuido en el texto de la etiqueta en Interface Builder
Espero que esto pueda ayudar a alguien más ...!
fuente
fuente
Mi propia solución fue creada con un método como el siguiente:
Funcionó con un solo color diferente en el mismo texto, pero puedes adaptarlo fácilmente a más colores en la misma oración.
fuente
Al usar el siguiente código, puede establecer varios colores según la palabra.
fuente
SwiftRichString
funciona perfecto! Puede usar+
para concatenar dos cadenas con atributosfuente