color change ios uitextfield

ios - change - uitextfield placeholder color swift 3



iPhone UITextField-Cambiar el color del texto del marcador de posiciĆ³n (30)

Para iOS 6.0 +

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

Espero eso ayude.

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

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

Preferiría hacer esto sin usar texto normal como el 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.


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 siguiente código. (No dude en actualizar este código, si lo cree, puede ser más claro y 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) } } }

Versión Swift 4

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


¿Por qué no UIAppearance método UIAppearance ?

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


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

#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


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


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

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


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


Esta solución para Swift 4.1

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


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

Swift 4.2:

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


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

_placeholderLabel.textColor

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


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


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


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


Otra opción que no requiere subclasificación: deje el marcador de posición en blanco y coloque una etiqueta en la parte superior 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)


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


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: -



Para manejar tanto la alineación vertical y horizontal 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


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


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

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


Soy nuevo en xcode y encontré una forma de conseguir el mismo efecto.

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

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;

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

NOTA: Todavía funciona en iOS 7: |


Tal vez quiera intentarlo de esta manera, pero Apple podría advertirle 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.


También en tu storyboard, sin una sola línea de código.


Versión rápida. 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 } } }


Ya me había 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á trabajando para 7.0 y superiores.


iOS 6 y versiones posteriores le attributedPlaceholder el UITextField de UITextField attributedPlaceholder en UITextField . iOS 3.2 y setAttributes:range: posteriores ofrecen setAttributes:range: on NSMutableAttributedString .

Puedes hacer lo siguiente:

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


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 .

Véase también drawTextInRect en UITextField no llamado

Podrías usar la solución de Digdog. Como no estoy seguro de si eso supera 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.

Aunque esto es un poco desordenado. El código se parece a esto (nota 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; }


en veloz 3.X

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


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


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