2013-09-03 7 views
18

Ich habe einige Antworten gesehen, die zeigen, wie die Platzhalter Textfarbe für UITextField zu ändern, um die drawPlaceholderInRect durch zwingende: Verfahren wie diese:Wie wird die Farbe des Platzhaltertexts für ein UITextField festgelegt, während die vorhandenen Eigenschaften beibehalten werden?

iPhone UITextField - Change placeholder text color

aber das macht die vorhandenen Attribute nicht beibehalten, wie Ausrichtung, Schriftart, etc ... Was ist ein besserer Weg, um das zu lösen?

Antwort

15

Es gibt tatsächlich einen viel besseren Weg, dies jetzt zu handhaben. Dies funktioniert für iOS 6 und 7.

(Beachten Sie dieses Beispiel, ich habe den Code in AwakeFromNib erstellt, da es Farben nicht einmal ändern wird. Aber wenn Sie XIB nicht verwenden, müssen Sie die ändern Ort, an dem Sie diesen Code setzen, wie in drawPlaceholderInRect,)

in diesem Beispiel erstellen wir eine Unterklasse von UITextField, außer Kraft setzen awakeFromNib und dann die Platzhalter-Text-Farbe auf rot gesetzt:

- (void)awakeFromNib 
{ 
    if ([self.attributedPlaceholder length]) 
    { 
     // Extract attributes 
     NSDictionary * attributes = (NSMutableDictionary *)[ (NSAttributedString *)self.attributedPlaceholder attributesAtIndex:0 effectiveRange:NULL]; 

     NSMutableDictionary * newAttributes = [[NSMutableDictionary alloc] initWithDictionary:attributes]; 

     [newAttributes setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName]; 

     // Set new text with extracted attributes 
     self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:[self.attributedPlaceholder string] attributes:newAttributes]; 

    } 
} 

die nette Sache Dieser Ansatz besteht darin, dass die aktuellen UITextField-Eigenschaften für die placeHolder-Zeichenfolge beibehalten werden, sodass Sie in IB arbeiten können das meiste von dem, was du eingestellt hast. Darüber hinaus ist es viel effizienter als jedes Mal, wenn Sie zeichnen müssen. Sie können damit auch jede andere gewünschte Eigenschaft für den placeHolder-Text ändern und gleichzeitig den Rest der Eigenschaften beibehalten.

Wie oben erwähnt, wenn Sie keine XIBs verwenden, müssen Sie dies zu einem anderen Zeitpunkt aufrufen. Wenn Sie diesen Code in die drawPlaceholderInRect: -Methode schreiben, stellen Sie sicher, dass Sie [super drawPlaceholderInRect:] am Ende aufrufen.

+0

Sie können 'drawPlaceholderInRect:' verwenden. Aktualisieren Sie einfach die Zeile zu: '[[self Platzhalter] drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByClipping Ausrichtung: self.textAlignment];'. Dies hält die Schriftart und Ausrichtung. – rmaddy

+0

Das würde bedeuten, dass Sie wissen, was der linebreakMode ist? Unabhängig davon ist es besser, wenn Sie meine Lösung oben verwenden, auch wenn Sie sie innerhalb des drawPlaceHolderInRect-Aufrufs verwenden. –

+0

Tanks, es hat gut funktioniert, ich habe es als Kategorie Klasse anstelle der Unterklasse verwendet –

3

Der sichere Weg zum Anpassen UITextField 's Platzhalter ist Unterklasse der UITextField und überschreiben placeholderRectForBounds:, Apple wird Sie nicht auf diese eine stören. Wenn Sie jedoch das Risiko eingehen wollen, können Sie auf diese Weise versuchen:

[self.MyTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; 

Source.

+0

Das vereitelt den ganzen Zweck der ursprünglichen Frage, die alle vorhandenen Textattribute vorsever ist, aber nur die Farbe ändern. –

+1

Danke Nazik. seine Arbeit für mich. –

35

Von iOS 6,

Ohne Subklassifizieren, kann man diese mit ein paar Zeilen Code zu erreichen, wie so:

UIColor *color = [UIColor blackColor]; 
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}]; 
+1

Dies ist keine vollständige Lösung, da die vorhandenen Attribute nicht beibehalten werden. Die unten ausgewählte Antwort löst das Beibehalten der Attribute, während der Platzhaltertext geändert wird und keine anderen Attribute gelöscht werden. –

19

mehrere Möglichkeiten gibt es, dies zu erreichen.

Mit Interface Builder oder Storyboard

  • das Textfeld auswählen, für die Sie Platzhalter wollen Farbe
  • gehen Sie auf die Identität Inspektor Menü oben rechts von Xcode
  • Fügen Sie den Schlüssel-Wert-Paar ändern Auf diese Weise

Key Weg = _placeholderLabel.textColor

Klicken Sie auf Typ und wählen Sie Farbe.

Wählen Sie dann die Farbe in Wert.

enter image description here

Der Platzhalter Farbsatz Code:

Verfahren 1:

[textField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"]; 

Verfahren 2:

Aufschalten drawPlaceholderInRect: (CGRect) rect Methode

- (void) drawPlaceholderInRect:(CGRect)rect { 
    [[UIColor blueColor] setFill]; 
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:14]]; 
} 
+0

https://Stackoverflow.com/a/21156050/1000906 arbeitete für mich –

+0

Alter, vielen Dank! Ich habe ein paar Stunden damit verbracht, das herauszufinden, aber ich konnte es nicht lösen, bis ich auf deinen Beitrag gestoßen bin ... Danke! – BlueFox

Verwandte Themen