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

Me gustaría cambiar el color del texto del marcador de posición que configuré en mi UITextField controles, para hacerlo 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 de marcador de posición real desde este método.

preguntado el 27 de agosto de 09 a las 07:08

30 Respuestas

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

Respondido el 22 de junio de 14 a las 16:06

Esto es bueno, pero recuerde que debe establecer un valor de marcador de posición en IB antes de que esto funcione. ganso

también vale la pena envolver esto en una llamada respondsToSelector, ya que sin él, este código se bloqueará en el objetivo de implementación anterior a 6.0 (selector no reconocido enviado a la instancia) - ganso

Los documentos para el attributedPlaceholder dice que usa atributos de texto, excepto el color. - matt connolly

Alguna idea de por qué no funciona para el atributo - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}]; - dev4u

En iOS 7 recibí este error: [<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field. - soy_jorf

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.

respondido 23 mar '16, 15:03

¿Está usando esto en producción? Me refiero a acceder a una propiedad privada. - Geri Borbás

Tal vez agregue el texto a su respuesta para copiar y pegar rápidamente. _placeholderLabel.textColor - philiiiiiipp

No use este método, lo he usado y la tienda itune ha rechazado mi solicitud. - asad alí

Creo que NUNCA debería recomendarse ningún tipo de método de biblioteca privada como solución a nada. Skrew

@jungledev _placeholderLabel es una propiedad privada. Esta solución está sujeta a ser rechazada para el uso de una API privada. - Sean Kladek

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

Respondido 06 ago 18, 08:08

Algo como [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment]; es probablemente mejor. De esa manera respetarás la textAlignment propiedad. He agregado esto a mi SSTextField clase. Siéntase libre de utilizarlo en sus proyectos. - Sam Soffes

Absolutamente NO hagas lo que dijo Koteg. NUNCA anule métodos a través de categorías. SIEMPRE - Josué Weinberg

@JoshuaWeinberg ¿Hay alguna razón específica detrás de su sugerencia? - krishnan

@Krishnan no admite 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án a ambos, o el orden en el que se llamarán. - sean Woodward

En iOS7 puede modificar el rect usando CGRectInset (rect, 0, (rect.size.height - self.font.lineHeight) / 2.0) para centrar verticalmente el texto. - Brian S

Puede cambiar el color del 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}];

respondido 08 nov., 13:06

Se sugiere la mejor respuesta. Funciona y utiliza API documentadas. - Ian Hoar

¿Cómo hace que esto funcione para UISearchBar? No hay ninguna propiedad atribuidaPlaceholder. - gilsaints88

Esta respuesta no es correcta: de acuerdo con los documentos, se ignora la información de color del texto del marcador de posición atribuido desarrollador.apple.com/library/ios/documentation/UIKit/Reference/… - Adlai grita

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 una propiedad de marcador de posición atribuida. Ben Clayton

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.

Rápido 3:

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

Rápido 4:

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

Rápido 4.2:

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

Respondido el 20 de Septiembre de 18 a las 13:09

Usar su solución en iOS8.2 funciona a las mil maravillas. Solución perfecta aquí. Utilizando en el objetivo C también. - Akshit Zaveri

Tal vez quieras intentarlo 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.

Respondido el 25 de Septiembre de 13 a las 00:09

Utilizo este método en mi aplicación. La revisión estuvo bien. Entonces creo que está bien usarlo. - Michael A.

Esto no es seguro para la tienda de aplicaciones y debería no Anímese, no está garantizado que obtenga la aprobación o permanezca en la aprobación con estas técnicas. - Sveinung Kval Bakken

Realmente no debería importar si está aprobado o no. Lo importante es que esto podría dañar su aplicación en futuras actualizaciones del sistema operativo. - pablasso

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

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

Swift 3.0 + guión gráfico

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

enter image description here

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

Respondido 17 Abr '19, 12:04

El compilador no puede averiguarlo NSAttributedStringKey. - Milán Kamilya

Funciona en iOS 13 - Jalil

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

respondido 10 nov., 17:05

Si no configuró el texto del marcador de posición antes de llamar, bloqueará la aplicación: apiño

Este es el mejor, gracias. @apinho, nada se estrellará aquí - Markus

// En Swift 4 if 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 traerá de vuelta el color del marcador de posición predeterminado. - Alessandro Vendruscolo

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

Respondido el 22 de junio de 14 a las 21:06

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

C objetivo

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

Para Swift 4.X

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

Para el código Swift de iOS 13

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

También puede utilizar 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 pueda ayudarte.

respondido 28 nov., 19:05

@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 compilará, no estoy hablando de colocarlo en la AppStore - Melany

IOS 13 esto estaba restringido ya no puedo usar esto - Kishore Kumar

@Mehdico Actualicé la respuesta para iOS 13. Espero que esto te ayude. - Ashu

Me tomó demasiado tiempo aprender que tenía que hacer este cambio en viewWillAppear or viewDidAppear. viewDidLoad es demasiado pronto. - Las cuatro

Tuve que usar UIColor(displayP3Red: 255, green: 255, blue: 255, alpha: 0.3) constructor para UIColor en lugar de UIColor(red: 255, green: 255, blue: 255, alpha: 0.3) - Lo aprecio

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

Respondido el 22 de junio de 16 a las 14:06

@Teddy, ¿cómo lo hiciste ahora? Empecé a tener problemas con esto. - Jalil

@Jalil Espero estar todavía a tiempo para ti. textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString: @ "text" atributos: @ {NSForegroundColorAttributeName: [UIColor colorWithHexString: @ "ffffff55"]}]; - Osito de peluche

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

Respondido el 25 de junio de 19 a las 02:06

¿Por qué no usas UIAppearance método:

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

Respondido el 19 de diciembre de 13 a las 13:12

¡Funciona genial! El color del texto no se ve afectado (al menos con un proxy diferente para la propiedad textColor) - CalienteJard

Muy bien trabajado pero mostrando una advertencia para este método. Chandni

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

enter image description here

Respondido 05 Feb 16, 10:02

¿Cómo es que sabes esto? Creo que es el mejor enfoque, pero ¿cómo se puede saber esto? Por favor diga que soy nuevo en la programación de iOS. - Yawar

Es muy universal. Una vez que lo sepa, úselo en todas partes;) - petr syrov

Sé que una vez que entienda lo que hay detrás de él, lo usaré mucho. Pero me refiero a "_placeholderLabel.textColor", esta debería ser una vista secundaria del campo de texto. ¿Hay alguna forma de ver este tipo de información sobre un control? - Yawar

@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 la ruta clave - Naishta

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. Estoy usando esto en todos mis proyectos desde hace dos años, pero Apple no me lo pidió.

Respondido el 07 de enero de 15 a las 05:01

lanza un terminating with uncaught exception of type NSException para iOS8 - Yar

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

Respondido el 07 de diciembre de 16 a las 11:12

Gracias !! Primero estaba usando CTStringAttributes y no UIStringAttributes y no pude entenderlo. Tenga cuidado de no usar esto: new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor }); - Yohan Dahmani

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

Respondido el 21 de Septiembre de 16 a las 13:09

Ofertas de iOS 6 y posteriores attributedPlaceholder on UITextField. Ofertas de iOS 3.2 y posteriores setAttributes:range: on NSMutableAttributedString.

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

Respondido 06 ago 18, 08:08

No estoy seguro de qué está causando el problema, este código lo he llamado en viewdidLoad. El nuevo color y tamaño de fuente aparece solo después de redibujar. ¿Hay algo más que deba hacerse junto con esto? - Vinayaka Karjigi

se resolvió, olvidé configurar la fuente para UITextfield antes de usar esa fuente para el texto del marcador de posición. mi error - Vinayaka Karjigi

Esta solución para Swift 4.1

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

Respondido 10 Oct 18, 10:10

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

contestado el 27 de mayo de 14 a las 21:05

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

Respondido 06 ago 18, 08:08

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 alignment: self.textAlignment]; - vida

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 DEBE ingresar un String donde "DON'T_DELETE" es, incluso si esa cadena está configurada en otro código. Podría ahorrarle cinco minutos de rascarse la cabeza.

Respondido 31 Oct 19, 02:10

Primordial 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

Puede usar la solución de digdog. Como no estoy seguro de si eso supera la revisión de Apples, 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 complicado. 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;
}

contestado el 23 de mayo de 17 a las 13:05

¿Cómo se sentiría al compartir su solución de revisión? - Adán

Agregué la solución que usé. Tuve que investigar un poco, ya que esto fue hace un tiempo :) - henning77

Hice algo similar a esto, pero coloqué el código en una categoría, y necesitaba hacer una verificación en shouldChangeCharacters sobre si hacerlo visible, que era un segundo método en la categoría llamado - (void) overlayPlaceholderVisible: (BOOL) visible ; - David van Dugteren

Soy nuevo en xcode y encontré una manera de lograr 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 alternativa y no una solución real, pero el efecto fue el mismo que obtuve de esto aquí

NOTA: Todavía funciona en iOS 7: |

Respondido el 20 de junio de 20 a las 10:06

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

Respondido el 25 de Septiembre de 13 a las 08:09

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

Respondido el 06 de diciembre de 13 a las 20:12

Estupendo. Esto no fue realmente obvio, probablemente me ahorraste algo de tiempo :) Sin embargo, edité tu solución, ya que creo que es una mejor idea usar el conjunto de fuentes en el Font propiedad del campo de texto. - Wolfgang Schreurs

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 que también ayude a algunos de ustedes:

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

Respondido el 10 de junio de 13 a las 11:06

UILineBreakModeTailTruncation está obsoleto a partir de iOS 6. - Supertecnoboff

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

respondido 15 mar '15, 07:03

Una pequeña pista sobre esto es que está accediendo a una iVar privada (_placeholderLabel) y en el pasado Apple ha sido un poco quisquilloso al hacer eso. :) - Alejandro W.

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;

Producción :-

enter image description here

contestado el 20 de mayo de 16 a las 06:05

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 como lo haría con el marcador de posición (borrando una vez que el usuario ingrese algo ..)

Respondido el 06 de diciembre de 10 a las 22:12

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 gastos generales a su proyecto. - James Parker

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.