Zeichenfolgenfarbe mit NSAttributedString ändern?

147

Ich habe einen Schieberegler für eine Umfrage, der die folgenden Zeichenfolgen basierend auf dem Wert des Schiebereglers anzeigt: "Sehr schlecht, schlecht, okay, gut, sehr gut".

Hier ist der Code für den Schieberegler:

- (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];
}

Ich möchte, dass "Sehr schlecht" rot ist, "Schlecht" orange, "Okay" gelb, "Gut" und "Sehr gut" grün.

Ich verstehe nicht, wie NSAttributedStringich das machen soll.

Adam
quelle
Du meinst einen UISlider? Das hat kein Etikett. Im Grunde geht es also um ein UILabel mit einer Schriftfarbe? Oder möchten Sie einen Teil des Textes farbig?
Roger
2
mögliches Duplikat von Wie benutzt man NSAttributedString?
John Parker
Verwenden Sie diese Bibliothek, es ist ganz einfach. github.com/iOSTechHub/AttributedString
Ashish Chauhan

Antworten:

196

Es besteht keine Notwendigkeit zur Verwendung NSAttributedString. Alles was Sie brauchen ist ein einfaches Etikett mit dem richtigentextColor . Außerdem funktioniert diese einfache Lösung mit allen Versionen von iOS, nicht nur mit iOS 6.

Aber wenn Sie unnötig verwenden möchten NSAttributedString, können Sie Folgendes tun:

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;
rmaddy
quelle
4
Ich verstehe nicht alle Abstimmungen. Meine Antwort ist viel einfacher als die Verwendung einer zugewiesenen Zeichenfolge. Das OP muss NSAttributedStringfür diese Aufgabe nicht verwendet werden. Es wäre eine Sache, wenn der Text des Etiketts mehrere Attribute benötigt, dies jedoch nicht. Das gesamte Etikett muss jeweils eine Farbe haben.
rmaddy
@ RubénE.Marín Aber das ist das Problem. Das OP glaubte fälschlicherweise, dass die Lösung die Verwendung erfordert NSAttributedString. Darum haben sie gebeten. Die eigentliche Frage sollte lauten: "Wie wird die Farbe des Etiketts anhand seines Werts festgelegt?" . Ich wies darauf hin, dass die Lösung keine erfordert NSAttributedStringund zeigte eine viel einfachere Antwort. Und das OP stimmte zu, indem es meine viel einfachere Antwort akzeptierte. Wenn das OP wirklich wollte NSAttributedString, hätten sie meine Antwort nicht akzeptiert. Es gibt also keinen Grund für die Abstimmungen. Ich beantwortete die wahre Frage und das OP akzeptierte.
rmaddy
24
In diesem Fall hätte ich die Frage mit NSAttributedString gelöst und danach auf Ihre einfachere und effizientere Lösung für den speziellen Fall des OP hingewiesen. Personen, die zu dieser Frage kommen, sind möglicherweise frustriert über Ihre Lösung, da sie nach Möglichkeiten suchen, die Textfarbe in NSAttributedString zu ändern (und dies würde Ihre Abstimmungen erklären).
Ruben Marin
15
Rubén hat recht: Ich bin hierher gekommen, weil ich die Farbe in einer zugeordneten Zeichenfolge festlegen muss, weil ich eine zusammengesetzte zugeordnete Zeichenfolge mit mehreren Farben und Schriftgrößen erstelle. Und die wichtigste Information, die ich brauchte, war der NSForegroundColorAttributeNameSchlüssel, den ich in den Apple-Dokumenten nur schwer finden konnte.
Erik van der Neut
5
Vielen Dank, dass Sie die Frage noch beantwortet haben !! auch wenn OP es nicht wirklich brauchte. So oft google ich etwas und lande auf einer Stapelüberlauffrage, nach der ich genau suche, nur um festzustellen, dass der weise Arsch, der die Frage beantwortet, entschieden hat, dass das OP nicht wirklich benötigt, wonach der Fragentitel gefragt hat, und beantwortete eine ganz andere Frage. Nun, Menschen in Zukunft, die aus Suchergebnissen stammen, von denen es möglicherweise 1000 im Gegensatz zum 1 OP gibt, möchten möglicherweise tatsächlich eine Lösung für die im Titel des Beitrags gestellte Frage. </ rant>
danny
112

Verwenden Sie so etwas (nicht vom Compiler geprüft)

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]];
Anoop Vaidya
quelle
Hey Anoop, ich freue mich dich wieder zu sehen! Ich habe den von Ihnen angegebenen Code überprüft und self.text.text durch self.scanLabel.text ersetzt, aber bei "word" wird eine Fehlermeldung angezeigt. Ich habe versucht, es ohne Glück durch @ "Very Bad" zu ersetzen.
Adam
Ich habe meine Antwort von hier kopiert stackoverflow.com/questions/14231879/…
Anoop Vaidya
Danke Anoop, aber kein Glück für mich. - [__ NSCFString _ui_synthesizeAttributedSubstringFromRange: usingDefaultAttributes:]: Nicht erkannter Selektor an Instanz 0x1f845af0 gesendet 2013-01-11 16: 27: 34.939 yellaProto [7829: 907] _ui_synthesizeAttributedSubstringFromRange: usingDefaultAttributes:]: Nicht erkannter Selektor an Instanz 0x1f845af0 'gesendet
Adam
Versuchen Sie einfach herauszufinden, welche "Texte"
Morkrom
@Morkrom: Wenn Sie 2. Kommentar in dieser Antwort sehen, dann werden Sie wissen: p
Anoop Vaidya
48

In 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

In 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 

Genießen.

App Dev Guy
quelle
28

Für Swift 5:

var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

Für Swift 4:

var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

Für Swift 3:

var attributes = [String: AnyObject]()
attributes[NSForegroundColorAttributeName] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString
Pableiros
quelle
7

Sie können erstellen NSAttributedString

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

ODER NSMutableAttributedString, um benutzerdefinierte Attribute mit Bereichen anzuwenden.

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)];

Verfügbare Attribute: NSAttributedStringKey


AKTUALISIEREN:

Swift 5.1

let message: String = greeting + someMessage
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2.0
    
// Note: UIFont(appFontFamily:ofSize:) is extended init.
let regularAttributes: [NSAttributedString.Key : Any] = [.font : UIFont(appFontFamily: .regular, ofSize: 15)!, .paragraphStyle : paragraphStyle]
let boldAttributes = [NSAttributedString.Key.font : UIFont(appFontFamily: .semiBold, ofSize: 15)!]

let mutableString = NSMutableAttributedString(string: message, attributes: regularAttributes)
mutableString.addAttributes(boldAttributes, range: NSMakeRange(0, greeting.count))
Lal Krishna
quelle
5

Hat mit Swift 4 NSAttributedStringKeyeine statische Eigenschaft namens foregroundColor. foregroundColorhat die folgende Erklärung:

static let foregroundColor: NSAttributedStringKey

Der Wert dieses Attributs ist ein UIColorObjekt. Verwenden Sie dieses Attribut, um die Farbe des Texts beim Rendern anzugeben. Wenn Sie dieses Attribut nicht angeben, wird der Text schwarz gerendert.

Der folgende Spielplatzcode zeigt, wie Sie die Textfarbe einer NSAttributedStringInstanz mit festlegen foregroundColor:

import UIKit

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

Der folgende Code zeigt eine mögliche UIViewControllerImplementierung, die sich darauf stützt NSAttributedString, um den Text und die Textfarbe von a UILabelvon a zu aktualisieren 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
    }

}

Beachten Sie jedoch, dass Sie NSAttributedStringfür ein solches Beispiel nicht wirklich verwenden müssen und sich einfach auf UILabel's textund textColorEigenschaften verlassen können. Daher können Sie Ihre updateDisplay()Implementierung durch den folgenden Code ersetzen :

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

Update für Swift 4.2

var attributes = [NSAttributedString.Key: AnyObject]()

attributes[.foregroundColor] = UIColor.blue

let attributedString = NSAttributedString(string: "Very Bad",
attributes: attributes)

label.attributedText = attributedString
Mithra Singam
quelle
1

Ein Liner für Swift:

NSAttributedString(string: "Red Text", attributes: [.foregroundColor: UIColor.red])
Fedotchenco Denis
quelle