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.
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
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. –
Tanks, es hat gut funktioniert, ich habe es als Kategorie Klasse anstelle der Unterklasse verwendet –