iPhone UITextField - Ändern Sie die Textfarbe des Platzhalters


566

Ich möchte die Farbe des Platzhaltertextes ändern, den ich in meinen UITextFieldSteuerelementen festgelegt habe, um ihn schwarz zu machen.

Ich würde dies lieber tun, ohne normalen Text als Platzhalter zu verwenden und alle Methoden überschreiben zu müssen, um das Verhalten eines Platzhalters nachzuahmen.

Ich glaube, wenn ich diese Methode überschreibe:

- (void)drawPlaceholderInRect:(CGRect)rect

dann sollte ich dazu in der Lage sein. Ich bin mir jedoch nicht sicher, wie ich mit dieser Methode auf das eigentliche Platzhalterobjekt zugreifen soll.

Antworten:


804

Seit der Einführung von zugewiesenen Zeichenfolgen in UIViews in iOS 6 ist es möglich, dem Platzhaltertext eine Farbe wie folgt zuzuweisen:

if ([textField respondsToSelector:@selector(setAttributedPlaceholder:)]) {
  UIColor *color = [UIColor blackColor];
  textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
} else {
  NSLog(@"Cannot set placeholder text's color, because deployment target is earlier than iOS 6.0");
  // TODO: Add fall-back code to set placeholder color.
}

2
Das ist gut - aber denken Sie daran, dass Sie einen Platzhalterwert in IB festlegen müssen, bevor dies funktioniert
gheese

4
Es lohnt sich auch, dies in einen RespondsToSelector-Aufruf zu
packen

5
In den Dokumenten für das attributedPlaceholdersagt, dass Textattribute mit Ausnahme der Farbe verwendet werden.
Matt Connolly

1
Irgendeine Idee, warum es für das Attribut nicht funktioniert - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u

3
Unter iOS 7 habe ich folgende Fehlermeldung erhalten:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf

237

Einfach und schmerzfrei, könnte für einige eine einfache Alternative sein.

_placeholderLabel.textColor

Apple wird für die Produktion nicht empfohlen und kann Ihre Einreichung ablehnen.


1
Verwenden Sie dies in der Produktion? Ich möchte auf ein Privateigentum zugreifen.
Geri Borbás

11
Fügen Sie den Text möglicherweise zu Ihrer Antwort hinzu, um ihn schnell zu kopieren und einzufügen. _placeholderLabel.textColor
Philiiiiiipp

47
Verwenden Sie diese Methode nicht, ich habe diese verwendet und itune store hat meine Bewerbung abgelehnt.
Asad Ali

1
Ich denke, jede Art von privater Bibliotheksmethode sollte NIEMALS als Lösung für irgendetwas empfohlen werden
Skrew

2
@jungledev _placeholderLabelist ein Privateigentum. Diese Lösung kann für die Verwendung der privaten API abgelehnt werden.
Sean Kladek

194

Sie können drawPlaceholderInRect:(CGRect)rectals solche überschreiben , um den Platzhaltertext manuell zu rendern:

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

44
So etwas [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];ist wahrscheinlich besser. Auf diese Weise respektieren Sie die textAlignmentEigenschaft. Ich habe dies meiner SSTextField- Klasse hinzugefügt . Fühlen Sie sich frei, in Ihren Projekten zu verwenden.
Sam Soffes

52
Tu auf keinen Fall das, was Koteg gesagt hat. Überschreiben Sie Methoden NIEMALS durch Kategorien. EVER
Joshua Weinberg

8
@JoshuaWeinberg Gibt es einen bestimmten Grund für Ihren Vorschlag?
Krishnan

5
@Krishnan Das Implementieren einer doppelten Methode in einer Kategorie wird nicht unterstützt, und Sie können nie sicher sein, welche Methode aufgerufen wird oder ob beide aufgerufen werden oder in welcher Reihenfolge sie aufgerufen werden.
Sean Woodward

8
In iOS7 können Sie das Rechteck ändern, indem Sie CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) verwenden, um den Text vertikal zu zentrieren.
Brian S

171

Mit dem folgenden Code können Sie die Textfarbe des Platzhalters in eine beliebige Farbe ändern.

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];

6
Beste Antwort vorgeschlagen. Funktioniert und verwendet dokumentierte APIs.
Ian Hoar

2
Wie funktioniert diese Funktion für UISearchBar? Es gibt keine attributedPlaceholder-Eigenschaft.
Gilstaints88

1
Diese Antwort ist nicht korrekt - laut den Dokumenten werden die Textfarbinformationen des zugeschriebenen Platzhalters ignoriert. Developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler

Vielen Dank an alle. Ich hoffe, es hat geholfen. Adlai Holler probier es aus, Bruder !!! Diese Antwort war für die vorherige Version von iOS. Wenn Sie eine bessere Antwort haben, sind wir offen für Vorschläge.
Manju

Funktioniert nicht unter iOS8, da keine Attribut-Platzhalter-Eigenschaft vorhanden ist
Ben Clayton

157

Vielleicht möchten Sie es auf diese Weise versuchen, aber Apple warnt Sie möglicherweise vor dem Zugriff auf Private Ivar:

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

HINWEIS
Dies funktioniert nicht auf iOS 7 mehr, nach Martin Alléus.


6
Ich benutze diese Methode in meiner App. Die Bewertung war in Ordnung. Ich denke, es ist in Ordnung, es zu benutzen.
Michael A.

9
Dies ist nicht App Store-sicher und sollte nicht empfohlen werden. Es wird nicht garantiert, dass Sie genehmigt werden oder mit diesen Techniken genehmigt bleiben.
Sveinung Kval Bakken

31
Es sollte nicht wirklich wichtig sein, ob es genehmigt ist oder nicht. Wichtig ist, dass dies Ihre App bei zukünftigen Betriebssystem-Updates beschädigen kann.
Pablasso

2
Ich habe kein Problem mit iOS 7 ... Ich habe es trotz des Hinweises versucht und es scheint gut zu funktionieren und ich habe diesen Ansatz in der Vergangenheit ohne Probleme verwendet.
WCByrne

6
Das war immer eine schlechte Idee, und jetzt ist es auf iOS 13 Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bugkaputt : 😈
Ryder Mackay

154

Dies funktioniert in Swift <3.0:

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

Getestet in iOS 8.2 und iOS 8.3 Beta 4.

Swift 3:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.red])

Swift 4:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])

Swift 4.2:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

Die Verwendung Ihrer Lösung unter iOS8.2 funktioniert wie ein Zauber. Perfekte Lösung hier. Verwendung in Ziel C auch.
Akshit Zaveri

73

In Swift:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}

In Swift 4.0:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}

Wenn Sie den Platzhaltertext vor dem Aufruf nicht festgelegt haben, stürzt die App ab
apinho

Dies ist das Beste, danke. @apinho nichts wird hier abstürzen
Markus

// In Swift 4, wenn placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (Zeichenfolge: Platzhalter, Attribute: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini

Beachten Sie, dass durch Ändern des Platzhaltertextwerts nach Ausführung dieses Codes die Standard-Platzhalterfarbe wiederhergestellt wird.
Alessandro Vendruscolo

66

Swift 3.0 + Storyboard

Um die Platzhalterfarbe im Storyboard zu ändern, erstellen Sie eine Erweiterung mit dem nächsten Code. (Sie können diesen Code jederzeit aktualisieren, wenn Sie der Meinung sind, dass er klarer und sicherer sein kann.)

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            guard let currentAttributedPlaceholderColor = attributedPlaceholder?.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor else { return UIColor.clear }
            return currentAttributedPlaceholderColor
        }
        set {
            guard let currentAttributedString = attributedPlaceholder else { return }
            let attributes = [NSForegroundColorAttributeName : newValue]

            attributedPlaceholder = NSAttributedString(string: currentAttributedString.string, attributes: attributes)
        }
    }
}

Geben Sie hier die Bildbeschreibung ein

Swift 4 Version

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedStringKey: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

Swift 5 Version

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedString.Key: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

Der Compiler kann es nicht herausfinden NSAttributedStringKey.
Milan Kamilya

Funktioniert in iOS 13
Jalil

43

Folgendes nur mit iOS6 + (wie im Kommentar von Alexander W angegeben):

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

33

Ich hatte mich bereits diesem Problem gestellt. In meinem Fall ist der folgende Code korrekt.

Ziel c

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

Für Swift 4.X.

tf_mobile.setValue(UIColor.white, forKeyPath: "_placeholderLabel.textColor")

Für iOS 13 Swift Code

tf_mobile.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

Sie können den folgenden Code auch für iOS 13 verwenden

let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(tf_mobile, iVar) as! UILabel
placeholderLabel.textColor = .red

Hoffe, das kann dir helfen.


@Ashu dies führt zu einem Absturz in ios 13 'Der Zugriff auf _placeholderLabel ivar von UITextField ist verboten. Dies ist ein Anwendungsfehler, der nicht einmal erstellt werden kann. Ich spreche nicht davon, ihn in AppStore zu platzieren
Melany

1
IOS 13 dies war eingeschränkt kann dies nicht mehr verwenden
Kishore Kumar

Objektcode wird unter IOS 13 getestet und funktioniert nicht.
Mehdico

1
@ Mehdico Ich habe die Antwort für iOS 13 aktualisiert. Ich hoffe, das hilft dir.
Ashu

Ich habe viel zu lange gebraucht, um zu erfahren, dass ich diese Änderung in viewWillAppearoder vornehmen musste viewDidAppear. viewDidLoadist zu früh.
Vier

32

Damit können wir die Farbe des Platzhaltertextes des Textfelds in iOS ändern

[self.userNameTxt setValue:[UIColor colorWithRed:41.0/255.0 green:91.0/255.0 blue:106.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];

1
Ab iOS13 wird dies nicht funktionieren
Teddy

@ Teddy wie hast du das jetzt gemacht? Ich bekam Probleme damit.
Jalil

@ Jalil Ich hoffe ich bin noch pünktlich für dich. textField.attributedPlaceholder = [[NSAttributedString-Zuweisung] initWithString: @ "text" -Attribute: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy

18

Warum verwenden Sie nicht einfach die UIAppearanceMethode:

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];

Funktioniert super! Die Farbe des Textes ist nicht betroffen (zumindest mit einem anderen Proxy für die textColor-Eigenschaft)
HotJard

18

Auch in Ihrem Storyboard, ohne einzelne Codezeile

Geben Sie hier die Bildbeschreibung ein


1
Woher weißt du das? Ich denke, es ist der beste Ansatz, aber woher kann man das wissen? Bitte sagen Sie mir, dass ich neu in der iOS-Programmierung bin.
Yawar

2
Es ist sehr universell. Sobald Sie es kennen, verwenden Sie es überall;)
Petr Syrov

Ich weiß, sobald ich verstehe, was dahinter steckt, werde ich es oft benutzen. Aber ich meine "_placeholderLabel.textColor", dies sollte eine untergeordnete Ansicht des Textfelds sein. Gibt es eine Möglichkeit, diese Art von Informationen zu einem Steuerelement anzuzeigen?
Yawar

2
@Yawar Sie können den Ansichtshierarchie-Inspektor in Xcode verwenden oder die Ansicht im Debugger überprüfen.
David Ganster

gut, unabhängig vom Textfeld, können Sie die gleiche 'Kachel / Name' für Schlüsselpfad verwenden
Naishta

16

in schnellem 3.X.

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])

in schnell 5

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black])

12

Für iOS 6.0 +

[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];

Ich hoffe es hilft.

Hinweis: Apple kann Ihre App ablehnen (0,01% Wahrscheinlichkeit), wenn wir auf die private API zugreifen. Ich verwende dies seit zwei Jahren in allen meinen Projekten, aber Apple hat nicht danach gefragt.


wirft ein terminating with uncaught exception of type NSExceptionfür iOS8
Yar

10

Für Xamarin.iOS-Entwickler habe ich es in diesem Dokument gefunden: https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });

Vielen Dank !! Ich habe zuerst CTStringAttributes und nicht UIStringAttributes verwendet und konnte es nicht herausfinden. Achten Sie darauf, dies nicht zu verwenden:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani

9

Schnelle Version. Wahrscheinlich würde es jemandem helfen.

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}

6

Kategorien FTW. Könnte optimiert werden, um eine effektive Farbänderung zu überprüfen.


#import <UIKit/UIKit.h>

@interface UITextField (OPConvenience)

@property (strong, nonatomic) UIColor* placeholderColor;

@end

#import "UITextField+OPConvenience.h"

@implementation UITextField (OPConvenience)

- (void) setPlaceholderColor: (UIColor*) color {
    if (color) {
        NSMutableAttributedString* attrString = [self.attributedPlaceholder mutableCopy];
        [attrString setAttributes: @{NSForegroundColorAttributeName: color} range: NSMakeRange(0,  attrString.length)];
        self.attributedPlaceholder =  attrString;
    }
}

- (UIColor*) placeholderColor {
    return [self.attributedPlaceholder attribute: NSForegroundColorAttributeName atIndex: 0 effectiveRange: NULL];
}

@end

6

Für die vertikale und horizontale Ausrichtung sowie die Farbe des Platzhalters in iOS7. drawInRect und drawAtPoint verwenden nicht mehr den aktuellen Kontext fillColor.

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html

Obj-C

@interface CustomPlaceHolderTextColorTextField : UITextField

@end


@implementation CustomPlaceHolderTextColorTextField : UITextField


-(void) drawPlaceholderInRect:(CGRect)rect  {
    if (self.placeholder) {
        // color of placeholder text
        UIColor *placeHolderTextColor = [UIColor redColor];

        CGSize drawSize = [self.placeholder sizeWithAttributes:[NSDictionary dictionaryWithObject:self.font forKey:NSFontAttributeName]];
        CGRect drawRect = rect;

        // verticially align text
        drawRect.origin.y = (rect.size.height - drawSize.height) * 0.5;

        // set alignment
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = self.textAlignment;

        // dictionary of attributes, font, paragraphstyle, and color
        NSDictionary *drawAttributes = @{NSFontAttributeName: self.font,
                                     NSParagraphStyleAttributeName : paragraphStyle,
                                     NSForegroundColorAttributeName : placeHolderTextColor};


        // draw
        [self.placeholder drawInRect:drawRect withAttributes:drawAttributes];
    }
}

@end

Vielen Dank für diese hervorragende Lösung, mit der Text vertikal richtig zentriert wird (nützlich bei benutzerdefinierten Schriftarten). Das einzige, was ich hinzufügen möchte, ist, dass diese Lösung nicht mit iOS 6 oder älter kompatibel ist (einfach zu beheben, indem auf [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail align: self.textAlignment] zurückgegriffen wird;
Lebensfreude

6

iOS 6 und höher bietet attributedPlaceholderweiterUITextField . iOS 3.2 und höher bietet setAttributes:range:weiterNSMutableAttributedString .

Sie können Folgendes tun:

NSMutableAttributedString *ms = [[NSMutableAttributedString alloc] initWithString:self.yourInput.placeholder];
UIFont *placeholderFont = self.yourInput.font;
NSRange fullRange = NSMakeRange(0, ms.length);
NSDictionary *newProps = @{NSForegroundColorAttributeName:[UIColor yourColor], NSFontAttributeName:placeholderFont};
[ms setAttributes:newProps range:fullRange];
self.yourInput.attributedPlaceholder = ms;

Nicht sicher, was das Problem verursacht, diesen Code habe ich in viewdidLoad aufgerufen. Neue Farbe und Schriftgröße werden erst nach dem Neuzeichnen angezeigt. muss noch etwas dazu getan werden?
Vinayaka Karjigi

Es wurde gelöst. Ich habe vergessen, die Schriftart für UITextfield festzulegen, bevor ich diese Schriftart für Platzhaltertext verwendet habe. mein schlechtes
Vinayaka Karjigi

6

Diese Lösung für Swift 4.1

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])

4

Überschreiben drawPlaceholderInRect: wäre der richtige Weg, funktioniert jedoch aufgrund eines Fehlers in der API (oder der Dokumentation) nicht.

Die Methode wird nie auf einem aufgerufen UITextField .

Siehe auch drawTextInRect auf UITextField nicht aufgerufen

Sie könnten die Lösung von digdog verwenden. Da ich nicht sicher bin, ob dies nach der Überprüfung durch Apples nicht möglich ist, habe ich eine andere Lösung gewählt: Überlagern Sie das Textfeld mit meiner eigenen Beschriftung, die das Platzhalterverhalten imitiert.

Das ist allerdings etwas chaotisch. Der Code sieht folgendermaßen aus (Hinweis: Ich mache dies in einer Unterklasse von TextField):

@implementation PlaceholderChangingTextField

- (void) changePlaceholderColor:(UIColor*)color
{    
    // Need to place the overlay placeholder exactly above the original placeholder
    UILabel *overlayPlaceholderLabel = [[[UILabel alloc] initWithFrame:CGRectMake(self.frame.origin.x + 8, self.frame.origin.y + 4, self.frame.size.width - 16, self.frame.size.height - 8)] autorelease];
    overlayPlaceholderLabel.backgroundColor = [UIColor whiteColor];
    overlayPlaceholderLabel.opaque = YES;
    overlayPlaceholderLabel.text = self.placeholder;
    overlayPlaceholderLabel.textColor = color;
    overlayPlaceholderLabel.font = self.font;
    // Need to add it to the superview, as otherwise we cannot overlay the buildin text label.
    [self.superview addSubview:overlayPlaceholderLabel];
    self.placeholder = nil;
}

Wie würden Sie Ihre bewertungsfreundliche Lösung teilen?
Adam

Ich habe die Lösung hinzugefügt, die ich verwendet habe. Ich musste ein bisschen graben, da dies vor einiger Zeit war :)
henning77

Ich habe etwas Ähnliches getan, aber ich habe den Code in eine Kategorie eingefügt und musste in shouldChangeCharacters überprüfen, ob er sichtbar gemacht werden soll. Dies war eine zweite Methode in der Kategorie - (void) overlayPlaceholderVisible: (BOOL) sichtbar ;;
David van Dugteren

3

Ich bin neu in xcode und habe einen Weg gefunden, um den gleichen Effekt zu erzielen.

Ich habe ein Uilabel anstelle des Platzhalters mit dem gewünschten Format platziert und darin versteckt

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    switch (textField.tag)
    {
        case 0:
            lblUserName.hidden=YES;
            break;

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Ich bin damit einverstanden, dass es eine Problemumgehung ist und keine echte Lösung, aber der Effekt war der gleiche, den ich über diesen Link erhalten habe

HINWEIS: Funktioniert immer noch unter iOS 7: |


3

Swift 5 MIT CAVEAT.

let attributes = [ NSAttributedString.Key.foregroundColor: UIColor.someColor ]
let placeHolderString = NSAttributedString(string: "DON'T_DELETE", attributes: attributes)
txtField.attributedPlaceholder = placeHolderString

Die Einschränkung besteht darin, dass Sie ein nicht leeres StringFeld eingeben müssen, in dem sich "DON'T_DELETE" befindet, auch wenn diese Zeichenfolge an anderer Stelle im Code festgelegt ist. Könnte Ihnen fünf Minuten Head-Sctratching ersparen.


2

Das Beste, was ich für iOS7 und weniger tun kann, ist:

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
  return [self textRectForBounds:bounds];
}

- (CGRect)textRectForBounds:(CGRect)bounds {
  CGRect rect = CGRectInset(bounds, 0, 6); //TODO: can be improved by comparing font size versus bounds.size.height
  return rect;
}

- (void)drawPlaceholderInRect:(CGRect)rect {
  UIColor *color =RGBColor(65, 65, 65);
  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.placeholder drawInRect:rect withAttributes:@{NSFontAttributeName:self.font, UITextAttributeTextColor:color}];
  } else {
    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font];
  }
}

2

Für diejenigen, die Monotouch (Xamarin.iOS) verwenden, ist hier Adams Antwort, übersetzt in C #:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}

Großartig. Dies war nicht wirklich offensichtlich, Sie haben mir wahrscheinlich einige Zeit gespart :) Ich habe Ihre Lösung jedoch bearbeitet, da ich denke, dass es eine bessere Idee ist, die in der FontEigenschaft des Textfelds festgelegte Schriftart zu verwenden .
Wolfgang Schreurs

1

Ich musste die Platzhalterausrichtung beibehalten, damit mir Adams Antwort nicht ausreichte.

Um dies zu lösen, habe ich eine kleine Variante verwendet, von der ich hoffe, dass sie auch einigen von Ihnen hilft:

- (void) drawPlaceholderInRect:(CGRect)rect {
    //search field placeholder color
    UIColor* color = [UIColor whiteColor];

    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}

UILineBreakModeTailTruncationist ab iOS 6 veraltet.
Supertecnoboff

1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];

Ein kleiner Hinweis dazu ist, dass Sie auf ein privates iVar (_placeholderLabel) zugreifen, und Apple war in der Vergangenheit ein wenig wählerisch dabei. :)
Alexander W

1

Zum Festlegen des Platzhalters für zugeschriebenes Textfeld mit mehreren Farben:

Geben Sie einfach den Text an.

  //txtServiceText is your Textfield
 _txtServiceText.placeholder=@"Badal/ Shah";
    NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:_txtServiceText.placeholder];
     [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor whiteColor] range:[_txtServiceText.placeholder rangeOfString:@"Badal/"]]; //Replace it with your first color Text
    [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor orangeColor] range:[_txtServiceText.placeholder rangeOfString:@"Shah"]]; // Replace it with your secondcolor string.
    _txtServiceText.attributedPlaceholder=mutable;

Ausgabe :-

Geben Sie hier die Bildbeschreibung ein


0

Eine weitere Option, für die keine Unterklasse erforderlich ist: Lassen Sie den Platzhalter leer und setzen Sie eine Beschriftung auf die Schaltfläche zum Bearbeiten. Verwalten Sie das Etikett so, wie Sie den Platzhalter verwalten würden (Löschen, sobald der Benutzer etwas eingibt.)


Ich denke, dass dies effizient wäre, wenn Sie ein Textfeld haben, aber wenn Sie versuchen, diese Änderung globaler vorzunehmen, würde diese Lösung Ihrem Projekt einen erheblichen Overhead hinzufügen.
James Parker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.