2011-06-28 18 views
85

Quiero mostrar una cadena como esta en un UILabel:UILabel con el texto de dos colores diferentes

Hay 5 resultados.

Donde el número 5 es de color rojo y el resto de la cadena es negra.

¿Cómo puedo hacer esto en el código?

+6

@EmptyStack Este es ciertamente ** no ** el caso ya que iOS 4 es compatible con NSAttributedString. Ver mi respuesta a continuación. –

Respuesta

4

Tener un UIWebView o más de una UILabel podría ser considerado excesivo para esta situación.

Mi sugerencia sería usar TTTAttributedLabel que es un reemplazo directo para UILabel que admite NSAttributedString. Esto significa que puede aplicar fácilmente diferentes estilos a diferentes rangos en una cadena.

207

La manera de hacerlo es utilizar NSAttributedString así:

NSMutableAttributedString *text = 
[[NSMutableAttributedString alloc] 
    initWithAttributedString: label.attributedText]; 

[text addAttribute:NSForegroundColorAttributeName 
      value:[UIColor redColor] 
      range:NSMakeRange(10, 1)]; 
[label setAttributedText: text]; 

he creado un UILabelextension to do it.

+7

Usar en> = iOS6 ... – Dilip

+0

¿Puedo agregar objetivos en él? Thnaks – UserDev

+0

¡Acabo de agregar su extensión a mi proyecto! ¡Gracias! – Zeb

6

Desde iOS 6, UIKit admite el dibujo de cadenas atribuidas, por lo que no se necesita ninguna extensión o reemplazo.

De UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText; 

sólo tiene que construir su NSAttributedString. Hay básicamente dos maneras:

  1. trozos Anexar texto con los mismos atributos - para cada parte cree uno NSAttributedString instancia y los añade a una NSMutableAttributedString

  2. Crear texto atribuido de simple cadena y luego añadir atribuido para rangos dados - encuentre el rango de su número (o lo que sea) y aplique diferentes atributos de color sobre eso.

3

JTAttributedLabel (por mystcolor) le permite utilizar el soporte de serie atribuido en UILabel bajo iOS 6 y al mismo tiempo su clase JTAttributedLabel bajo iOS 5 a través de su JTAutoLabel.

22

Aquí tiene

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:lblTemp.text]; 
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)]; 
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)]; 
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)]; 
lblTemp.attributedText = string; 
37

he hecho esto mediante la creación de un category para NSMutableAttributedString

-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color 
{ 
    NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch]; 

    if (range.location != NSNotFound) { 
     [self addAttribute:NSForegroundColorAttributeName value:color range:range]; 
    } 
} 

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

SWIFT 3

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

USO

func setColoredLabel() { 
    let string = 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 
} 

y aquí está el resultado

Multi Colored Text

+0

¿Cómo puedo usarlo? – RaviJSS

+2

Necesita crear una nueva Categoría para NSMutableAttributedString con el método ... de todos modos agregué esta muestra a github, puede tomarla y verificarla https://github.com/anoop4real/NSMutableAttributedString-Color – anoop4real

+0

Pero necesito configurar el color de todo el alfabeto con incasesensitive en una cadena .... como todas las "e" en el color rojo de toda la cadena – RaviJSS

6

Anups respuesta en veloz. Se puede reutilizar de cualquier clase.

En archivo rápida

extension NSMutableAttributedString { 

    func setColorForStr(textToFind: String, color: UIColor) { 

     let range = self.mutableString.rangeOfString(textToFind, options:NSStringCompareOptions.CaseInsensitiveSearch); 
     if range.location != NSNotFound { 
      self.addAttribute(NSForegroundColorAttributeName, value: color, range: range); 
     } 

    } 
} 

En algunos controlador de vista

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.labelShopInYourNetwork.text!); 
attributedString.setColorForStr("YOUR NETWORK", color: UIColor(red: 0.039, green: 0.020, blue: 0.490, alpha: 1.0)); 
self.labelShopInYourNetwork.attributedText = attributedString; 
12
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' "; 
NSString *myString = @"Not a member?signin"; 

//Create mutable string from original one 
NSMutableAttributedString *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 it 
NSRange range = [myString rangeOfString:@"signin"]; 
[attString addAttribute:NSForegroundColorAttributeName value:[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; 
2

hay una solución

extension UILabel{ 


    func setSubTextColor(pSubString : String, pColor : UIColor){ 
     let attributedString: NSMutableAttributedString = 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 

    } 
} 

Swift 3.0 y hay un ejemplo de llamada:

let colorString = " (string in red)" 
self.mLabel.text = "classic color" + colorString 
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red) 
+0

Hola, ¿cómo hago esto si quiero agregar dos coloresCadenas diferentes? Intenté usar tu ejemplo y solo agregué otro, pero solo colorea uno de ellos ... –

+0

Prueba esto: deja colorString = "(cadena en rojo)" deja 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) –

+0

Esto es extraño, todavía no cambia ambos: https://s24.postimg.org/ds0rpyyut/Screen_Shot_2017_01_21_at_19_52_51.png. –

0
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 

    } 
} 
0

Mi propia solución se creó un método como el siguiente:

-(void)setColorForText:(NSString*) textToFind originalText:(NSString *)originalString withColor:(UIColor*)color andLabel:(UILabel *)label{ 

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:originalString]; 
NSRange range = [originalString rangeOfString:textToFind]; 

[attString addAttribute:NSForegroundColorAttributeName value:color range:range]; 

label.attributedText = attString; 

if (range.location != NSNotFound) { 
    [attString addAttribute:NSForegroundColorAttributeName value:color range:range]; 
} 
label.attributedText = attString; } 

Se trabajó con un solo color diferente en el mismo texto pero se puede adaptar fácilmente a más colores en la misma oración

0

Para Xamarin usuarios Tengo un método estático C# donde pase en una matriz de cadenas, una matriz de UIColours y variedad de UIFonts (que tendrá que coincidir de longitud). La cadena atribuida se devuelve.

véase:

public static NSMutableAttributedString GetFormattedText(string[] texts, UIColor[] colors, UIFont[] fonts) 
    { 

     NSMutableAttributedString attrString = new NSMutableAttributedString(string.Join("", texts)); 
     int position = 0; 

     for (int i = 0; i < texts.Length; i++) 
     { 
      attrString.AddAttribute(new NSString("NSForegroundColorAttributeName"), colors[i], new NSRange(position, texts[i].Length)); 

      var fontAttribute = new UIStringAttributes 
      { 
       Font = fonts[i] 
      }; 

      attrString.AddAttributes(fontAttribute, new NSRange(position, texts[i].Length)); 

      position += texts[i].Length; 
     } 

     return attrString; 

    } 
4

Swift 4

// An attributed string extension to achieve colors on text. 
extension NSMutableAttributedString { 

    func setColor(color: UIColor, forText stringValue: String) { 
     let range: NSRange = self.mutableString.range(of: stringValue, options: .caseInsensitive) 
     self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range) 
    } 

} 

// Try it with label 
let label = UILabel() 
label.frame = CGRect(x: 70, y: 100, width: 260, height: 30) 
let stringValue = "There are 5 results." 
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue) 
attributedString.setColor(color: UIColor.red, forText: "5") 
label.font = UIFont.systemFont(ofSize: 26) 
label.attributedText = attributedString 
self.view.addSubview(label) 

Resultado

enter image description here


Swift 3

func setColoredLabel() { 
     var string: NSMutableAttributedString = NSMutableAttributedString(string: "redgreenblue") 
     string.setColor(color: UIColor.redColor(), forText: "red") 
     string.setColor(color: UIColor.greenColor(), forText: "green") 
     string.setColor(color: UIColor.blueColor(, forText: "blue") 
     mylabel.attributedText = string 
    } 


func setColor(color: UIColor, forText stringValue: String) { 
     var range: NSRange = self.mutableString.rangeOfString(stringValue, options: NSCaseInsensitiveSearch) 
     if range != nil { 
      self.addAttribute(NSForegroundColorAttributeName, value: color, range: range) 
     } 
    } 

Resultado:

enter image description here

0

Por mediante el siguiente código se puede establecer múltiples colores en función de la palabra.

NSMutableArray * array = [[NSMutableArray alloc] initWithObjects:@"1 ball",@"2 ball",@"3 ball",@"4 ball", nil];  
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] init]; 
for (NSString * str in array) 
{ 
    NSMutableAttributedString * textstr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ,",str] attributes:@{NSForegroundColorAttributeName :[self getRandomColor]}]; 
    [attStr appendAttributedString:textstr]; 
    } 
UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 300, 300, 30)]; 
lab.attributedText = attStr; 
[self.view addSubview:lab]; 

-(UIColor *) getRandomColor 
{ 
    CGFloat redcolor = arc4random() % 255/255.0; 
    CGFloat greencolor = arc4random() % 255/255.0; 
    CGFloat bluencolor = arc4random() % 255/255.0; 
    return [UIColor colorWithRed:redcolor green:greencolor blue:bluencolor alpha:1.0]; 
} 
0

Swift 4 y superior: Inspirado por anoop4real's solution, aquí es una extensión de cadena que se puede utilizar para generar texto con 2 colores diferentes.

extension String { 

    func attributedStringForPartiallyColoredText(_ textToFind: String, with color: UIColor) -> NSMutableAttributedString { 
     let mutableAttributedstring = NSMutableAttributedString(string: self) 
     let range = mutableAttributedstring.mutableString.range(of: textToFind, options: .caseInsensitive) 
     if range.location != NSNotFound { 
      mutableAttributedstring.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range) 
     } 
     return mutableAttributedstring 
    } 
} 

El siguiente ejemplo cambia el color del asterisco al rojo conservando el color original de la etiqueta para el texto restante.

label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1)) 
Cuestiones relacionadas