web-dev-qa-db-de.com

iPhone UITextField - Ändert die Textfarbe des Platzhalters

Ich möchte die Farbe des Platzhaltertexts ändern, den ich in meinen UITextField-Steuerelementen festgelegt habe, um ihn schwarz zu machen.

Ich würde dies lieber machen, ohne normalen Text als Platzhalter zu verwenden und alle Methoden außer Kraft zu setzen, um das Verhalten eines Platzhalters nachzuahmen.

Ich glaube, wenn ich diese Methode überschreibe:

- (void)drawPlaceholderInRect:(CGRect)rect

dann sollte ich das können. Ich bin mir jedoch nicht sicher, wie Sie aus dieser Methode auf das eigentliche Platzhalterobjekt zugreifen können.

525
adam

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

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

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

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.
}
782
user1071136

Leicht und schmerzfrei, könnte für manche eine einfache Alternative sein.

_placeholderLabel.textColor

Nicht für die Produktion empfohlen, Apple kann Ihre Einreichung ablehnen.

236
Jack

Sie können die Textfarbe des Platzhalters mit dem folgenden Code in jede gewünschte Farbe ändern.

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

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
Laut Martin Alléus funktioniert das auf iOS 7 nicht mehr.

157
digdog

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

Schnell 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])
122
Tomino

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])
}
63
Beninho85

Folgendes nur mit iOS6 + (wie in Alexander Ws Kommentar angegeben):

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

Swift 3.0 + Storyboard

Um die Platzhalterfarbe im Storyboard zu ändern, erstellen Sie eine Erweiterung mit dem nächsten Code. (Fühlen Sie sich frei, diesen Code zu aktualisieren, wenn Sie denken, er kann klarer und sicherer sein).

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)
        }
    }
}

 enter image description here

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)
        }
    }
}
38
Nik Kov

Damit können wir die Farbe des Platzhaltertextes von Textfeld 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"];
32
Uma Madhavi

Ich war schon mit diesem Problem konfrontiert. In meinem Fall ist der Code korrekt. 

Ziel c

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

Für Swift 4.X

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

Hoffe, das kann dir helfen.

22
Ashu

Warum verwenden Sie nicht einfach die UIAppearance-Methode:

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

Auch in Ihrem Storyboard, ohne eine einzige Codezeile

 enter image description here

17
Petr Syrov

Für iOS 6.0 +

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

Ich hoffe es hilft.

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

12
Fahim Parkar

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 });
10
ManuQiao

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
        }
    }
}
9
Max Tymchii

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
osxdirk

Um sowohl die vertikale und horizontale Ausrichtung als auch die Farbe des Platzhalters in iOS7 zu behandeln. drawInRect und drawAtPoint verwenden den aktuellen Kontext fillColor nicht mehr.

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
6
aumansoftware

iOS 6 und höher bietet attributedPlaceholder für UITextField. iOS 3.2 und höher bietet setAttributes:range: für NSMutableAttributedString.

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;
5
William Power

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

Die Methode wird nie für eine UITextField aufgerufen.

Siehe auch drawTextInRect in UITextField nicht aufgerufen

Sie können die Lösung von digdog verwenden. Da ich nicht sicher bin, ob dies Apples Review hinterlässt, habe ich eine andere Lösung gewählt: Überlagern Sie das Textfeld mit einem eigenen Label, das das Verhalten des Platzhalters nachahmt.

Dies ist jedoch etwas unordentlich .. Der Code sieht folgendermaßen aus (Hinweis: Ich mache das innerhalb 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;
}
4
henning77

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

Ich habe anstelle des Platzhalters einen Namen 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 sich um eine Umgehung handelt und keine echte Lösung, aber der Effekt war der gleiche, der aus diesem Link

HINWEIS: funktioniert noch unter iOS 7: |

3
amar

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
Aleksei Minaev
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
2
Mubin Shaikh

Für diejenigen, die Monotouch (Xamarin.iOS) verwenden, hier die Antwort von Adam, ü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);
    }
}
2
Diego

in Swift 3.X

passwordTxtField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])
2
MAhipal Singh

Ich musste die Platzhalterausrichtung beibehalten, sodass adams Antwort nicht genug für mich war.

Um dieses Problem zu lösen, habe ich eine kleine Variante verwendet, von der ich hoffe, dass sie auch einigen von Ihnen helfen wird:

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

Diese Lösung für Swift 4.1 

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

Für das Set "Attributed Textfield Placeholder" mit mehreren Farben 

Geben Sie einfach den Text an.

  //txtServiceText is your Textfield
 [email protected]"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 :- 

 enter image description here

1
Badal Shah

In Swift 3  

import UIKit

let TEXTFIELD_BLUE  = UIColor.blue
let TEXTFIELD_GRAY  = UIColor.gray

class DBTextField: UITextField {
    /// Tetxfield Placeholder Color
    @IBInspectable var palceHolderColor: UIColor = TEXTFIELD_GRAY
    func setupTextField () {
        self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "",
                                                            attributes:[NSForegroundColorAttributeName: palceHolderColor])
    }
}

class DBLocalizedTextField : UITextField {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.placeholder = self.placeholder
    }
}
0
Rob-4608

Eine weitere Option, für die keine Unterklassifizierung erforderlich ist: Lassen Sie den Platzhalter leer und platzieren Sie ein Etikett auf der Bearbeitungsschaltfläche. Verwalten Sie das Etikett genauso wie Sie den Platzhalter verwalten würden (löschen, sobald der Benutzer etwas eingibt.)

0
kolinko