ios objective-c uitextfield

ios - Cambio de la fuente UITextField Placeholder



objective-c (10)

Estoy cambiando el color del texto del marcador de posición con el siguiente código, pero cuando trato de agregar NSFontAttribute obtengo el error de compilación "too many arguments to method call, expect 2 have 3"

UIColor *color = [UIColor blackColor]; _nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Name" attributes:@{NSForegroundColorAttributeName: color},@{NSFontAttributeName:@"Roboto-Bold"}];

Esto funciona bien:

UIColor *color = [UIColor blackColor]; _nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Name" attributes:@{NSForegroundColorAttributeName: color}];


Actualización para Swift 4.x :

textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: [ .foregroundColor: UIColor.lightGray, .font: UIFont.boldSystemFont(ofSize: 14.0) ])


Apreciar @ddevaz respuesta.

Solución de subclase UITextField

La respuesta anterior funciona perfectamente para UITextField . Pero cuando uso la subclase UITextField e intento ejecutar este método en ella. Entonces no está funcionando.

Encontré otra solución solo cuando subclases UITextField . Reemplace el método de abajo en su subclase UITextField y le hará un trabajo.

- (void) drawPlaceholderInRect:(CGRect)rect { NSDictionary *attrDictionary = @{ NSForegroundColorAttributeName: [UIColor lightGrayColor], NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:17.0] }; [[self placeholder] drawInRect:rect withAttributes:attrDictionary]; }


Debe subclasificar UITextField y anular el método de:

- (void)drawPlaceholderInRect:(CGRect)rect;

Aquí está la implementación a continuación:

- (void)drawPlaceholderInRect:(CGRect)rect { NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor lightGrayColor], NSFontAttributeName : [UIFont italicSystemFontOfSize:self.font.pointSize] }; // center vertically CGSize textSize = [self.placeholder sizeWithAttributes:attributes]; CGFloat hdif = rect.size.height - textSize.height; hdif = MAX(0, hdif); rect.origin.y += ceil(hdif/2.0); [[self placeholder] drawInRect:rect withAttributes:attributes]; }

Para más información, puede hacer clic aquí


Para la comodidad de las personas rápidas:

someTextField.attributedPlaceholder = NSAttributedString(string: "someString", attributes:[NSForegroundColorAttributeName: UIColor.lightGrayColor(), NSFontAttributeName: PlaceHolderFont])


Puede usar el código siguiente Primero busque el nombre de la fuente aceptada por el sistema para su fuente personalizada

for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { NSLog(@"%@", fontName); } }

y luego use el código a continuación, haga su marcador de posición con fuente personalizada

searchTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Where are you shopping?" attributes:@{NSFontAttributeName : font }];

De lo contrario, puede haber posibilidad de obtener el objeto nil [1] para la fuente no encontrada


Si desea admitir iOS 6 y versiones anteriores, entonces:

UIColor *placeholderColor = [UIColor lightTextColor]; UIFont *placeholderFont = [UIFont systemFontOfSize:[UIFont systemFontSize]]; if ([textField respondsToSelector:@selector(attributedPlaceholder)]) { #ifdef __IPHONE_6_0 textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:textField.placeholder attributes: // NOTE: textField.placeholder can''t be nil @{ NSForegroundColorAttributeName : placeholderColor, NSFontAttributeName : placeholderFont }]; #endif } else { // for pre-iOS6 [textField setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"]; [textField setValue:placeholderFont forKeyPath:@"_placeholderLabel.font"]; }


Actualización para Swift 4

let attributes = [ NSAttributedStringKey.foregroundColor: .black, NSAttributedStringKey.font : UIFont(name: "Your font name", size: 14)! ] someTextfield.attributedPlaceholder = NSAttributedString(string: "Placeholder text", attributes:attributes)


C objetivo:

UIColor *color = [UIColor blackColor]; someUITextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder Text" attributes:@{ NSForegroundColorAttributeName: color, NSFontAttributeName : [UIFont fontWithName:@"Roboto-Bold" size:17.0] } ];

(No hay corchetes entre los pares clave-valor del dictionary literal).

Rápido:

let attributes = [ NSForegroundColorAttributeName: UIColor.blackColor(), NSFontAttributeName : UIFont(name: "Roboto-Bold", size: 17)! // Note the ! ] someUITextField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes:attributes)


Versión de trabajo para Swift 4

let attributes = [NSAttributedStringKey.foregroundColor: UIColor.black, .font : UIFont.systemFont(ofSize: 14, weight: .regular)] someTextfield.attributedPlaceholder = NSAttributedString(string: "Placeholder text", attributes:attributes)


let attributes: [NSAttributedStringKey : Any] = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "Menlo", size: 17.0) ?? UIFont.systemFont(ofSize: 17.0) ] textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: attributes)

Nota: cuando usamos el método UIFont (nombre: "Menlo", tamaño: 17.0), si el nombre de la fuente no puede obtenerlo en ios, entonces será nulo, por lo que debemos proporcionar la fuente predeterminada. Fue explicado arriba.

Puede usar el código siguiente Primero busque el nombre de la fuente aceptada por el sistema para su fuente personalizada

for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { NSLog(@"%@", fontName); } }