Änderung der UITextField-Platzhalterfarbe

74

Wie kann man die Platzhalterfarbe des dynamisch ändern UITextField? Dies ist immer die gleiche Systemfarbe.

Keine Option im xib-Editor.

der Geher
quelle
In welchen Fällen können Sie die Farbe ändern?
Suryakant Sharma
wenn das UITextField deaktiviert ist
theWalker

Antworten:

163

Aus Dokumenten

@property (nichtatomar, Kopie) NSAttributedString * attributedPlaceholder

Diese Eigenschaft ist standardmäßig gleich Null. Wenn festgelegt, wird die Platzhalterzeichenfolge mit einer 70% igen Graufarbe und den verbleibenden Stilinformationen (außer der Textfarbe) der zugewiesenen Zeichenfolge gezeichnet. Durch das Zuweisen eines neuen Werts zu dieser Eigenschaft wird auch der Wert der Platzhalter-Eigenschaft durch dieselben Zeichenfolgendaten ersetzt, allerdings ohne Formatierungsinformationen. Das Zuweisen eines neuen Werts zu dieser Eigenschaft wirkt sich nicht auf andere stilbezogene Eigenschaften des Textfelds aus.

Ziel c

NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"Some Text" attributes:@{ NSForegroundColorAttributeName : [UIColor redColor] }];
self.myTextField.attributedPlaceholder = str;

Schnell

let str = NSAttributedString(string: "Text", attributes: [NSForegroundColorAttributeName:UIColor.redColor()])
myTextField.attributedPlaceholder = str

Swift 4

let str = NSAttributedString(string: "Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])
myTextField.attributedPlaceholder = str
DogCoffee
quelle
Ich kann es nicht testen, NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString: myString]; ist immer null.
TheWalker
Warum erstellen Sie eine veränderbare zugeordnete Zeichenfolge? Tun Sie einfach:NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"Some Text" attributes:@{ UITextAttributeTextColor : [UIColor redColor] }];
rmaddy
Cheers @rmaddy, ich habe NSForegroundColorAttributeName verwendet.
DogCoffee
41

Einfache und perfekte Lösung.

_placeholderLabel.textColor

In kurzer Zeit

myTextField.attributedPlaceholder = 
NSAttributedString(string: "placeholder", attributes:[NSForegroundColorAttributeName : UIColor.redColor()])

Ziel c

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
   initWithString:@"Full Name"
   attributes:@{NSForegroundColorAttributeName:color}];

PS 3 verschiedene Antworten von Stackoverflow kopiert.

iAhmed
quelle
3
Warnung für _placeholderLabel: Einige Benutzer melden Ablehnung des App Store: stackoverflow.com/questions/1340224/…
ftvs
Wenn Sie _placeholderLabel verwendet haben, erhalten Sie diesen Absturz. Der Zugriff auf _placeholderLabel ivar von UITextField ist verboten. Dies ist ein Anwendungsfehler
Hosny
12

Verwenden Sie den folgenden Code

[YourtextField setValue:[UIColor colorWithRed:97.0/255.0 green:1.0/255.0 blue:17.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];
Pradhyuman sinh
quelle
4
Ihre App wird abgelehnt, wenn Sie dies verwenden und auf die private API zugreifen. Verwenden Sie stattdessen die Eigenschaft attributePlaceholder des UITextField.
Aumanets
Ich denke, dies ist keine private API, die Sie auch in der aktuellen App verwenden können. Keine private API verwenden
Pradhyuman sinh
1
@aumanets es ist keine private API ... Es ist Privateigentum von UITextfield .. Es ist Schlüsselwertcodierung ... überprüfen Sie diese stackoverflow.com/questions/16601468/…
Pradhyuman sinh
2
Ja, Sie haben Recht, es ist ein Privateigentum. Auf jeden Fall ist es keine gute Praxis, auf diese Weise auf Eigenschaften / Variablen zuzugreifen. Eines Tages kann Apple den Namen dieser Eigenschaft in einen anderen Namen ändern, der die App zum Absturz bringt, und Sie erhalten keine Kompilierungswarnung in Ihrem Code.
Aumanets
1
Wenn Sie _placeholderLabel verwendet haben, erhalten Sie diesen Absturz. Der Zugriff auf _placeholderLabel ivar von UITextField ist verboten. Dies ist ein Anwendungsfehler
Hosny
5

Fügen Sie zuerst diese Erweiterung hinzu

extension UITextField{
    @IBInspectable var placeHolderTextColor: UIColor? {
        set {
            let placeholderText = self.placeholder != nil ? self.placeholder! : ""
            attributedPlaceholder = NSAttributedString(string:placeholderText, attributes:[NSForegroundColorAttributeName: newValue!])
        }
        get{
            return self.placeHolderTextColor
        }
    }
}

Anschließend können Sie die Farbe des Platzhaltertextes über das Storyboard oder einfach wie folgt ändern:

textfield.placeHolderTextColor = UIColor.red
Medin Piranej
quelle
3

Ich benutze dies in SWIFT:

myTextField.attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])

Es scheint, dass dies für andere funktioniert ... Ich habe keine Ahnung, warum es bei mir vorher nicht funktioniert hat ... vielleicht einige Projekteinstellungen. Danke für die Kommentare. Derzeit habe ich keine Möglichkeit, es erneut zu testen.

Veraltet: Aber ich weiß nicht warum, Text wird korrekt angewendet, aber die Platzhalterfarbe bleibt gleich (schwarz / grau).

--iOS8

Tomino
quelle
2
Dies ist keine Antwort
Alex Pretzlav
Ja, ist es nicht (weder Ihr Kommentar). Aber ich möchte keinen neuen Thread starten, da dieser Code genau der gleiche obj-c-Code ist, der schnell umgeschrieben wurde.
Tomino
Ich weiß nicht, warum es bei dir nicht funktioniert hat. Aber es hat bei mir gut
funktioniert
Ich weiß es auch nicht, aber es scheint, dass dies für andere funktioniert :-) Vielleicht einige Projekteinstellungen ...
Tomino
2

Versuche dies:

NSAttributedString *strUser = [[NSAttributedString alloc] initWithString:@"Username" attributes:@{ NSForegroundColorAttributeName : [UIColor whiteColor] }];
NSAttributedString *strPassword = [[NSAttributedString alloc] initWithString:@"Password" attributes:@{ NSForegroundColorAttributeName : [UIColor whiteColor] }];

self.username.attributedPlaceholder = strUser;
self.password.attributedPlaceholder = strPassword;
Mohammad Kamran Usmani
quelle
1

Sie können den folgenden Code verwenden

[txtUsername setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
Hardik Mamtora
quelle
1

Diese Lösung funktioniert ohne Unterklassen und ohne private Ivars:

@IBOutlet weak var emailTextField: UITextField! {
    didSet {
        if emailTextField != nil {
            let placeholderText = NSLocalizedString("Tap here to enter", comment: "Tap here to enter")
            let placeholderString = NSAttributedString(string: placeholderText, attributes: [NSForegroundColorAttributeName: UIColor(white: 0.66, alpha: 1.0)])
            emailTextField.attributedPlaceholder = placeholderString
        }
    }
}
Ron
quelle
1

Versuche dies.

UIColor *color = [UIColor redColor];
self.txtUsername.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Placeholder Text" attributes:@{NSForegroundColorAttributeName:color}];
Kuldeep
quelle
0

@ DogCoffees Antwort in Swift wäre

let placeholderAttrs = [ NSForegroundColorAttributeName : UIColor.redColor()]
let placeholder = NSAttributedString(string: "Some text", attributes: placeholderAttrs)

textField.attributedPlaceholder = placeholder
rodrigoalvesvieira
quelle
0

Dies ist eine verbesserte Version der Erweiterung von @Medin Piranej (gute Idee übrigens!). Diese Version vermeidet einen endlosen Zyklus, wenn Sie versuchen, placeHolderTextColor abzurufen, und verhindert Abstürze, wenn der Farbsatz Null ist.

public extension UITextField {

@IBInspectable public var placeholderColor: UIColor? {
    get {
        if let attributedPlaceholder = attributedPlaceholder, attributedPlaceholder.length > 0 {
            var attributes = attributedPlaceholder.attributes(at: 0,
                                                              longestEffectiveRange: nil,
                                                              in: NSRange(location: 0, length: attributedPlaceholder.length))
            return attributes[NSForegroundColorAttributeName] as? UIColor
        }
        return nil
    }
    set {
        if let placeholderColor = newValue {
            attributedPlaceholder = NSAttributedString(string: placeholder ?? "",
                                                       attributes:[NSForegroundColorAttributeName: placeholderColor])
        } else {
            // The placeholder string is drawn using a system-defined color.
            attributedPlaceholder = NSAttributedString(string: placeholder ?? "")
        }
    }
}

}}

Boherna
quelle
0

Für Swift 3 können wir diesen Code verwenden, um die Platzhaltertextfarbe für UITextfield zu ändern

 let placeholderColor = UIColor.red
 mytextField.attributedPlaceholder = NSAttributedString(string: mytextField.placeholder, attributes: [NSForegroundColorAttributeName : placeholderColor])
Waliyan
quelle
0

Swift 4

let placeholderColor = UIColor.red
self.passwordTextField?.attributedPlaceholder = 
NSAttributedString(string:"placeholderText", attributes: 
[NSAttributedStringKey.foregroundColor : placeholderColor])
Adriana
quelle