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?
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?
NSAttributedString
es el camino a seguir. La siguiente pregunta tiene una gran respuesta que le muestra cómo hacerlo How do you use NSAttributedString
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.
Para mostrar texto corto y formateado que no necesita ser editable, Core Text es el camino a seguir. Hay varios proyectos de código abierto para etiquetas que usan NSAttributedString
y Core Text para renderizar. Ver CoreTextAttributedLabel o OHAttributedLabel por ejemplo.
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 UILabel
extension to do it.
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:
trozos Anexar texto con los mismos atributos - para cada parte cree uno NSAttributedString
instancia y los añade a una NSMutableAttributedString
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.
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.
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;
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
¿Cómo puedo usarlo? – RaviJSS
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
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
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;
//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;
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)
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 ... –
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) –
Esto es extraño, todavía no cambia ambos: https://s24.postimg.org/ds0rpyyut/Screen_Shot_2017_01_21_at_19_52_51.png. –
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
}
}
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
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;
}
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
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:
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];
}
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))
@EmptyStack Este es ciertamente ** no ** el caso ya que iOS 4 es compatible con NSAttributedString. Ver mi respuesta a continuación. –