J'ai un curseur pour un sondage qui affiche les chaînes suivantes en fonction de la valeur du curseur: "Très mauvais, mauvais, bon, bon, très bon".
Voici le code pour le curseur:
- (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];
}
Je veux que "Very Bad" soit en rouge, "Bad" en orange, "Ok" en jaune, "Good" et "Very Good" en vert.
Je ne comprends pas comment utiliser NSAttributedString
pour y arriver.
Il n'est pas nécessaire d'utiliser NSAttributedString
. Tout ce dont vous avez besoin est une simple étiquette avec le bon textColor
. De plus, cette solution simple fonctionnera avec toutes les versions d'iOS, pas seulement iOS 6.
Mais si vous souhaitez utiliser inutilement NSAttributedString
, vous pouvez faire quelque chose comme ceci:
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;
Utilisez quelque chose comme ceci (Pas de compilateur coché)
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]];
Dans 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
Dans Swift:
// 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
Prendre plaisir.
Pour Swift 4:
var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.foregroundColor] = UIColor.red
let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)
label.attributedText = attributedString
Pour Swift 3:
var attributes = [String: AnyObject]()
attributes[NSForegroundColorAttributeName] = UIColor.red
let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)
label.attributedText = attributedString
Vous pouvez créer NSAttributedString
NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor redColor] };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"My Color String" attributes:attrs];
OU NSMutableAttributedString
pour appliquer des attributs personnalisés avec des plages.
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)];
Attributs disponibles: NSAttributedStringKey
Avec Swift 4, NSAttributedStringKey
a une propriété statique appelée foregroundColor
. foregroundColor
a la déclaration suivante:
static let foregroundColor: NSAttributedStringKey
La valeur de cet attribut est un objet
UIColor
. Utilisez cet attribut pour spécifier la couleur du texte lors du rendu. Si vous ne spécifiez pas cet attribut, le texte est rendu en noir.
Le code de terrain de jeu suivant montre comment définir la couleur du texte d'une instance NSAttributedString
avec foregroundColor
:
import UIKit
let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)
Le code ci-dessous montre une implémentation possible de UIViewController
reposant sur NSAttributedString
afin de mettre à jour le texte et la couleur du texte d'un UILabel
à partir de 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
}
}
Notez cependant que vous n'avez pas vraiment besoin d'utiliser NSAttributedString
pour un tel exemple et que vous pouvez simplement vous appuyer sur les propriétés de UILabel
, text
et textColor
. Par conséquent, vous pouvez remplacer votre implémentation updateDisplay()
par le code suivant:
func updateDisplay() {
label.text = currentStatus.display.text
label.textColor = currentStatus.display.color
slider.value = Float(currentStatus.rawValue)
}
Mise à jour pour Swift 4.2
var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = .blue
let attributedString = NSAttributedString(string: "Very Bad",
attributes: attributes)
label.attributedText = attributedString