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

566

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

Preferiría hacer esto sin usar 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 poder hacer esto. Pero no estoy seguro de cómo acceder al objeto marcador de posición real desde este método.

Adán
fuente

Respuestas:

804

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.
}
usuario1071136
fuente
2
Esto es bueno - pero recuerde que necesita para establecer un valor de marcador de posición en el IB para este trabajo
gheese
44
también vale la pena concluir esto en una llamada a RespondsToSelector, ya que sin él este código se bloqueará en el destino de implementación anterior a 6.0 (selector no reconocido enviado a la instancia)
gheese
55
Los documentos para el attributedPlaceholderdice que usa atributos de texto, excepto el color.
Matt Connolly
1
Alguna idea de por qué no funciona para el atributo - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u
3
En iOS 7 recibí este error:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf
237

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

_placeholderLabel.textColor

No sugerido para producción, Apple puede rechazar su envío.

Jack
fuente
1
¿Estás usando esto en producción? Me refiero a acceder a una propiedad privada.
Geri Borbás
11
Tal vez agregue el texto a su respuesta para copiar y pegar rápidamente. _placeholderLabel.textColor
Philiiiiiipp
47
No use este método, lo he usado e itune store, ha rechazado mi solicitud.
Asad ali
1
Creo que NUNCA se debería recomendar ningún tipo de método de biblioteca privada como solución para nada
Skrew
2
@jungledev _placeholderLabeles una propiedad privada. Esta solución está sujeta a ser rechazada por el uso de API privada.
Sean Kladek
194

Puede anular drawPlaceholderInRect:(CGRect)rectcomo 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]];
}
Adán
fuente
44
Algo así [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];es probablemente mejor. De esa manera respetará la textAlignmentpropiedad. He agregado esto a mi clase SSTextField . Siéntase libre de usar en sus proyectos.
Sam Soffes
52
Absolutamente NO hagas lo que Koteg dijo. NUNCA anule los métodos a través de categorías. NUNCA
Joshua Weinberg
8
@ JoshuaWeinberg ¿Hay alguna razón específica detrás de su sugestión?
Krishnan
55
@ Krishnan no implementa la implementación de un método duplicado en una categoría, y nunca puede estar seguro de qué método se llamará, o si se llamará a ambos, o el orden en que se llamarán.
sean woodward
8
En iOS7 puede alterar el rect utilizando CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) para centrar verticalmente el texto.
Brian S
171

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}];
Manju
fuente
66
La mejor respuesta sugerida. Funciona y utiliza API documentadas.
Ian Hoar
2
¿Cómo haces que esto funcione para UISearchBar? No hay propiedad atribuida de Placeholder.
gilsaints88
1
Esta respuesta no es correcta: según los documentos, se ignora la información del color del texto del atributo Placeplace developer.apple.com/library/ios/documentation/UIKit/Reference/…
Adlai Holler el
Gracias a todos. Espero que haya sido de alguna ayuda. Adlai Holler pruébalo hermano !!! Esta respuesta fue para la versión anterior de iOS. Si tiene una mejor respuesta, estamos abiertos a sugerencias.
Manju
No funciona en iOS8 ya que no hay propiedad atribuida Placeplace
Ben Clayton
157

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.

digdog
fuente
66
Yo uso este método en mi aplicación. La crítica estuvo bien. Así que creo que está bien usarlo.
Michael A.
99
Esto no es seguro en la tienda de aplicaciones y no se debe alentar, no se garantiza que se apruebe o se mantenga aprobado con estas técnicas.
Sveinung Kval Bakken
31
Realmente no debería importar si está aprobado o no realmente. Lo importante es que esto podría romper su aplicación en futuras actualizaciones del sistema operativo.
Pablasso
2
No tengo ningún problema con iOS 7 ... Lo intenté a pesar de la nota y parece funcionar bien y he usado este enfoque en el pasado sin problemas.
WCByrne
66
Esto siempre fue una mala idea, y ahora está roto en iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug😈
Ryder Mackay
154

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])
Tomino
fuente
Usar tu solución en iOS8.2 funciona de maravilla. La solución perfecta aquí. Utilizando en el objetivo C también.
Akshit Zaveri
73

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])
}
Beninho85
fuente
Si no configuró el texto del marcador de posición antes de llamar, se bloqueará la aplicación
apinho
Este es el mejor, gracias. @apinho, nada se estrellará aquí
Markus
// En Swift 4 si let placeholder = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (cadena: marcador de posición, atributos: [NSAttributedStringKey.foregroundColor: UIColor.white])}
Ronaldo Albertini
Tenga en cuenta que cambiar el valor del texto del marcador de posición después de que se haya ejecutado este código devolverá el color predeterminado del marcador de posición.
Alessandro Vendruscolo
66

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. (siéntase libre de 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)
        }
    }
}

ingrese la descripción de la imagen aquí

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

Versión Swift 5

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)
        }
    }
}
Nik Kov
fuente
El compilador no puede averiguarlo NSAttributedStringKey.
Milan Kamilya
Funciona en iOS 13
Jalil
43

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}];
Gaurav Gilani
fuente
33

Ya me había enfrentado a este problema. En mi caso, el código a continuación es correcto.

C objetivo

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

Para Swift 4.X

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

Para iOS 13 Swift Code

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

También puede usar el siguiente código para iOS 13

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

Espero que esto te pueda ayudar.

Ashu
fuente
@Ashu, esto causa un bloqueo en ios 13 'El acceso a _placeholderLabel ivar de UITextField está prohibido. Este es un error de la aplicación 'ni siquiera se construirá No estoy hablando de colocarlo en la AppStore
Melany
1
IOS 13 esto estaba restringido no puede usar esto más
Kishore Kumar
El código Objc se prueba en IOS 13 y no funciona.
Mehdico
1
@Mehdico Actualicé la respuesta para iOS 13. Espero que esto te ayude.
Ashu
Me llevó demasiado tiempo saber que tenía que hacer este cambio en viewWillAppearo viewDidAppear. viewDidLoades muy temprano
Cuatro
32

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"];
Uma Madhavi
fuente
1
A partir de iOS13 esto no funcionará
Teddy
@Teddy, ¿cómo lo hiciste ahora? Empecé a tener problemas con esto.
Jalil
@Jalil Espero que todavía esté a tiempo para ti. textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString: @ atributos "text": @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}];
Teddy
18

¿Por qué no usas el UIAppearancemétodo?

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];
Valerii Lider
fuente
¡Funciona genial! El color del texto no se ve afectado (al menos con un proxy diferente para la propiedad textColor)
HotJard
18

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

ingrese la descripción de la imagen aquí

Petr Syrov
fuente
1
¿Cómo es que sabes esto? Es el mejor enfoque, pero ¿cómo se puede saber esto? Por favor, diga que soy nuevo en la programación de iOS.
Yawar
2
Es muy universal Una vez que lo sepa,
úselo
Sé que una vez que entienda qué hay detrás, lo usaré mucho. Pero quiero decir "_placeholderLabel.textColor", esta debería ser una vista secundaria del campo de texto. ¿Hay alguna manera de ver este tipo de información sobre un control?
Yawar
2
@Yawar Puede usar el inspector de jerarquía de vistas en Xcode o introspectar la vista en el depurador.
David Ganster
bueno, independientemente del campo de texto, puede usar el mismo 'mosaico / nombre' para keypath
Naishta
16

en swift 3.X

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

en Swift 5

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

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 una API privada. Lo uso en todos mis proyectos desde hace dos años, pero Apple no me lo pidió.

Fahim Parkar
fuente
lanza un terminating with uncaught exception of type NSExceptionpara iOS8
Yar
10

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 });
ManuQiao
fuente
Gracias !! Primero estaba usando CTStringAttributes y no UIStringAttributes y no pude resolverlo. Tenga cuidado de no usar esto:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
Yohan Dahmani
9

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
        }
    }
}
Max Tymchii
fuente
6

Categorías FTW. Podría optimizarse para verificar un 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
osxdirk
fuente
6

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
aumansoftware
fuente
Gracias por esta excelente solución, que centra correctamente el texto verticalmente (útil con fuentes personalizadas). Lo único que agregaría es que esta solución no es compatible con iOS 6 o anterior (lo suficientemente fácil de solucionar recurriendo a [self.placeholder drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByTruncatingTail alineación: self.textAlignment];
lifjoy
6

iOS 6 y ofertas posteriores attributedPlaceholdersobre UITextField. iOS 3.2 y posteriores ofertas 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;
William Power
fuente
No estoy seguro de qué está causando el problema, este código que he llamado en viewdidLoad. el nuevo color y tamaño de fuente aparecen solo después de volver a dibujar. ¿Hay algo más que hacer junto con esto?
Vinayaka Karjigi
se resolvió, olvidé configurar la fuente para UITextfield antes de usar esa fuente para el texto de marcador de posición. mi mal
Vinayaka Karjigi
6

Esta solución para Swift 4.1

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

La anulación 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.

Vea también drawTextInRect en UITextField no llamado

Puede usar la solución de digdog. Como no estoy seguro de 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.

Sin embargo, esto es un poco desordenado. El código se ve así (tenga en cuenta 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;
}
Henning77
fuente
¿Qué le parecería compartir su solución fácil de revisar?
adam
Agregué la solución que usé. Tuve que cavar un poco, ya que esto fue hace algún tiempo :)
henning77
Hice algo similar a esto, pero coloqué el código en una categoría, y necesitaba hacer un check in shouldChangeCharacters para ver si era visible, que era un segundo método en la categoría llamada - (vacío) overlayPlaceholderVisible: (BOOL) visible ;
David van Dugteren
3

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

Coloqué un uilabel en lugar del marcador de posición con el formato deseado y lo escondí 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 y no una solución real, pero el efecto fue el mismo que obtuve de este enlace

NOTA: Todavía funciona en iOS 7: |

amar
fuente
3

Swift 5 CON CAVEAT.

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

La advertencia es que DEBES ingresar un Stringespacio no vacío donde esté "DON'T_DELETE", incluso si esa cadena está establecida en el código en otro lugar. Puede ahorrarte cinco minutos de rascarse la cabeza.

HenryRootTwo
fuente
2

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];
  }
}
Aleksei Minaev
fuente
2

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);
    }
}
Diego
fuente
Excelente. Esto no era realmente obvio, probablemente me ahorró algo de tiempo :) Sin embargo, edité su solución, ya que creo que es una mejor idea usar el conjunto de fuentes en la Fontpropiedad del campo de texto.
Wolfgang Schreurs
1

Necesitaba mantener la alineación del marcador de posición, por lo que la respuesta de Adam no fue 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];
}
Tomer Even
fuente
UILineBreakModeTailTruncationestá en desuso a partir de iOS 6.
Supertecnoboff
1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];
Mubin Shaikh
fuente
Un pequeño indicio sobre esto es que está accediendo a un iVar privado (_placeholderLabel) y en el pasado Apple ha sido un poco quisquilloso al hacerlo. :)
Alexander W
1

Para establecer un marcador de posición de campo de texto atribuido con varios colores,

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

ingrese la descripción de la imagen aquí

Badal Shah
fuente
0

Otra opción que no requiere subclases: 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 (borrado una vez que el usuario ingresa algo ...)

Kolinko
fuente
Creo que esto sería eficiente si tiene un campo de texto, pero si está tratando de hacer este cambio a una escala más global, esta solución agregaría una cantidad considerable de sobrecarga a su proyecto.
James Parker