ios cocoa-touch nsattributedstring

ios - nsattributedstring swift 4



¿Cambiar el color de la cadena con NSAttributedString? (6)

Con Swift 4, NSAttributedStringKey tiene una propiedad estática llamada foregroundColor . foregroundColor tiene la siguiente declaración:

static let foregroundColor: NSAttributedStringKey

El valor de este atributo es un objeto UIColor . Use este atributo para especificar el color del texto durante la representación. Si no especifica este atributo, el texto se representa en negro.

El siguiente código de Playground muestra cómo establecer el color del texto de una instancia NSAttributedString con foregroundColor :

import UIKit let string = "Some text" let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red] let attributedString = NSAttributedString(string: string, attributes: attributes)

El siguiente código muestra una posible implementación de UIViewController que se basa en NSAttributedString para actualizar el texto y el color del texto de un UILabel desde un UISlider :

import UIKit enum Status: Int { case veryBad = 0, bad, okay, good, veryGood var display: (text: String, color: UIColor) { switch self { case .veryBad: return ("Very bad", .red) case .bad: return ("Bad", .orange) case .okay: return ("Okay", .yellow) case .good: return ("Good", .green) case .veryGood: return ("Very good", .blue) } } static let minimumValue = Status.veryBad.rawValue static let maximumValue = Status.veryGood.rawValue }

final class ViewController: UIViewController { @IBOutlet weak var label: UILabel! @IBOutlet weak var slider: UISlider! var currentStatus: Status = Status.veryBad { didSet { // currentStatus is our model. Observe its changes to update our display updateDisplay() } } override func viewDidLoad() { super.viewDidLoad() // Prepare slider slider.minimumValue = Float(Status.minimumValue) slider.maximumValue = Float(Status.maximumValue) // Set display updateDisplay() } func updateDisplay() { let attributes = [NSAttributedStringKey.foregroundColor : currentStatus.display.color] let attributedString = NSAttributedString(string: currentStatus.display.text, attributes: attributes) label.attributedText = attributedString slider.value = Float(currentStatus.rawValue) } @IBAction func updateCurrentStatus(_ sender: UISlider) { let value = Int(sender.value.rounded()) guard let status = Status(rawValue: value) else { fatalError("Could not get Status object from value") } currentStatus = status } }

Sin embargo, tenga en cuenta que realmente no necesita usar NSAttributedString para este ejemplo y simplemente puede confiar en las UILabel de text y textColor . Por lo tanto, puede reemplazar su implementación updateDisplay() con el siguiente código:

func updateDisplay() { label.text = currentStatus.display.text label.textColor = currentStatus.display.color slider.value = Float(currentStatus.rawValue) }

Tengo un control deslizante para una encuesta que muestra las siguientes cadenas basadas en el valor del control deslizante: "Muy mal, mal, bien, bien, muy bien".

Aquí está el código para el control deslizante:

- (IBAction) sliderValueChanged:(UISlider *)sender { scanLabel.text = [NSString stringWithFormat:@" %.f", [sender value]]; NSArray *texts=[NSArray arrayWithObjects:@"Very Bad", @"Bad", @"Okay", @"Good", @"Very Good", @"Very Good", nil]; NSInteger sliderValue=[sender value]; //make the slider value in given range integer one. self.scanLabel.text=[texts objectAtIndex:sliderValue]; }

Quiero que "Muy Malo" sea rojo, "Malo" sea naranja, "Bien" que sea amarillo, "Bueno" y "Muy bueno" para que sea verde.

No entiendo cómo usar NSAttributedString para hacer esto.


En Swift 4 :

// Custom color let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1) // create the attributed colour let attributedStringColor = [NSAttributedStringKey.foregroundColor : greenColor]; // create the attributed string let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor) // Set the label label.attributedText = attributedString

En Swift 3 :

// Custom color let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1) // create the attributed color let attributedStringColor : NSDictionary = [NSForegroundColorAttributeName : greenColor]; // create the attributed string let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor as? [String : AnyObject]) // Set the label label.attributedText = attributedString

Disfrutar.


No es necesario usar NSAttributedString . Todo lo que necesita es una etiqueta simple con el texto correcto. Además, esta solución simple funcionará con todas las versiones de iOS, no solo con iOS 6.

Pero si innecesariamente desea usar NSAttributedString , puede hacer algo como esto:

UIColor *color = [UIColor redColor]; // select needed color NSString *string = ... // the string to colorize NSDictionary *attrs = @{ NSForegroundColorAttributeName : color }; NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:string attributes:attrs]; self.scanLabel.attributedText = attrStr;


Para Swift 4:

var attributes = [NSAttributedStringKey: AnyObject]() attributes[.foregroundColor] = UIColor.red let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes) label.attributedText = attributedString

Para Swift 3:

var attributes = [String: AnyObject]() attributes[NSForegroundColorAttributeName] = UIColor.red let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes) label.attributedText = attributedString


Puede crear NSAttributedString

NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor redColor] }; NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"My Color String" attributes:attrs];

O NSMutableAttributedString para aplicar atributos personalizados con rangos

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@%@", methodPrefix, method] attributes: @{ NSFontAttributeName : FONT_MYRIADPRO(48) }]; [attributedString addAttribute:NSFontAttributeName value:FONT_MYRIADPRO_SEMIBOLD(48) range:NSMakeRange(methodPrefix.length, method.length)];

Atributos disponibles: NSAttributedStringKey


Use algo como esto (no compilador marcado)

NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:self.text.text]; NSRange range=[self.myLabel.text rangeOfString:texts[sliderValue]]; //myLabel is the outlet from where you will get the text, it can be same or different NSArray *colors=@[[UIColor redColor], [UIColor redColor], [UIColor yellowColor], [UIColor greenColor] ]; [string addAttribute:NSForegroundColorAttributeName value:colors[sliderValue] range:range]; [self.scanLabel setAttributedText:texts[sliderValue]];