iPhone UITextField – Cambiar el color del texto del marcador de posición

Me gustaría cambiar el color del texto de marcador de posición que configuré en mis controles UITextField , para hacerlo negro.

Preferiría hacer esto sin utilizar texto normal como marcador de posición y tener que anular todos los métodos para imitar el comportamiento de un marcador de posición.

Creo que si anulo este método:

 - (void)drawPlaceholderInRect:(CGRect)rect 

entonces debería ser capaz de hacer esto. Pero no estoy seguro de cómo acceder al objeto marcador de posición real desde este método.

Desde la introducción de cadenas atribuidas en UIViews en iOS 6, es posible asignar un color al texto del marcador de posición de esta manera:

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

Fácil y sin dolor, podría ser una alternativa fácil para algunos.

 _placeholderLabel.textColor 

No sugerido para la producción, Apple puede rechazar su presentación.

Puede anular drawPlaceholderInRect:(CGRect)rect como tal para representar manualmente el texto del marcador de posición:

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

Tal vez quieras probar de esta manera, pero Apple podría advertirte sobre el acceso a ivar privado:

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

NOTA
Esto ya no funciona en iOS 7, según Martin Alléus.

Puede cambiar el texto de marcador de posición en cualquier color que desee utilizando el código siguiente.

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

Esto funciona en Swift <3.0:

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

Probado en iOS 8.2 y 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]) 

En Swift:

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

En Swift 4.0:

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

Lo siguiente solo con iOS6 + (como se indica en el comentario de Alexander W):

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

Swift 3.0 + Storyboard

Para cambiar el color del marcador de posición en el guión gráfico, cree una extensión con el código siguiente. (No dude en actualizar este código, si lo cree, puede ser más claro y más seguro).

 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 versión

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

Con esto podemos cambiar el color del texto del marcador de posición del campo de texto en iOS

 [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"]; 

Ya me he enfrentado a este problema. En mycase a continuación, el código es correcto.

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

Espero, esto puede ayudarte. Está funcionando para 7.0 o superior.

¿Por qué no UIAppearance método UIAppearance ?

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

También en su guión gráfico, sin una sola línea de código

enter image description here

Para iOS 6.0 +

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

Espero eso ayude.

Nota: Apple puede rechazar (0.01% posibilidades) su aplicación ya que estamos accediendo a API privada. Estoy usando esto en todos mis proyectos desde hace dos años, pero Apple no me pidió esto.

Para los desarrolladores de Xamarin.iOS, lo encontré en este documento https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

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

Versión Swift. Probablemente ayudaría a alguien.

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

Categorías FTW. Podría optimizarse para verificar el cambio de color efectivo.


 #import  @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 

Para manejar la alineación vertical y horizontal, así como el color del marcador de posición en iOS7. drawInRect y drawAtPoint ya no usan el contexto actual 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 

drawPlaceholderInRect: sería la forma correcta, pero no funciona debido a un error en la API (o la documentación).

El método nunca se llama en un UITextField .

Ver también drawTextInRect en UITextField no llamado

Puede usar la solución de digdog. Como no estoy seguro si eso pasa la revisión de Apple, elegí una solución diferente: superponer el campo de texto con mi propia etiqueta que imita el comportamiento del marcador de posición.

Esto es un poco desordenado sin embargo. El código se ve así (Note que estoy haciendo esto dentro de una subclase de 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; } 

Soy nuevo en xcode y encontré el camino para el mismo efecto.

Coloqué un uilabel en lugar del marcador de posición con el formato deseado y lo oculté en

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

Estoy de acuerdo en que es una solución alternativa y no una solución real, pero el efecto fue el mismo lo obtuve de este enlace

NOTA: Todavía funciona en iOS 7: |

iOS 6 y versiones posteriores ofrecen attributedPlaceholder en UITextField . iOS 3.2 y setAttributes:range: posteriores ofrecen setAttributes:range: en NSMutableAttributedString .

Puedes hacer lo siguiente:

 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; 

Lo mejor que puedo hacer para iOS7 y menos es:

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

Para aquellos que usan Monotouch (Xamarin.iOS), aquí está la respuesta de Adam, traducida a C #:

 public class MyTextBox : UITextField { public override void DrawPlaceholder(RectangleF rect) { UIColor.FromWhiteAlpha(0.5f, 1f).SetFill(); new NSString(this.Placeholder).DrawString(rect, Font); } } 
 [txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"]; 

en veloz 3.X

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

Necesitaba mantener la alineación del marcador de posición para que la respuesta de Adam no fuera suficiente para mí.

Para resolver esto, utilicé una pequeña variación que espero ayude a algunos de ustedes también:

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

Para establecer marcador de posición de campo de texto atribuido con color múltiple,

Solo especifica el Texto,

  //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; 

Salida: –

enter image description here

Otra opción que no requiere subclases: deje el marcador de posición en blanco y coloque una etiqueta encima del botón de edición. Administre la etiqueta tal como lo haría con el marcador de posición (borrando una vez que el usuario ingrese algo …)

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

Sugeriría otra solución. Dado que el texto del marcador de posición utiliza la configuración de fuente predeterminada del campo de texto, simplemente configure el color de fuente inicial para el color de fuente de marcador de posición que desee. A continuación, configure el delegado de UITextField e implemente los siguientes métodos:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //set color for text input textField.textColor = [UIColor blackColor]; return YES; } - (BOOL)textFieldShouldClear:(UITextField *)textField { //set color for placeholder text textField.textColor = [UIColor redColor]; return YES; } 

Por lo tanto, si un usuario comienza a escribir en el campo de texto, el color del texto cambia a negro y, una vez que el campo de texto se borra nuevamente, el texto del marcador de posición aparecerá nuevamente en color rojo.

Saludos, anka