2010-09-08 11 views
43

Estoy creando un UITextField programáticamente y colocándolo dentro de un UIView. El tamaño de fuente está establecido en 15.0f (fuente del sistema). Pero el marcador de posición que aparece no está centrado en la vista de texto. ¿Alguien sabe como resolver esto?Texto de marcador de posición no centrado para UITextField creado mediante programación

Encontré algunas referencias en SO para texto borroso, etc. y traté de establecer el marco del campo de texto con valores enteros, pero no hace la diferencia.

UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f, 6.0f, 278.0f, 32.0f)]; 
[txtField setPlaceholder:@"My placeholder"]; 
[txtField setFont:[UIFont systemFontOfSize:15.0]]; 
[txtField setBorderStyle:UITextBorderStyleRoundedRect]; 
[txtField setAutocorrectionType:UITextAutocorrectionTypeNo]; 
[txtField setAutocapitalizationType:UITextAutocapitalizationTypeNone]; 
[txtField setKeyboardType:UIKeyboardTypeEmailAddress]; 
[txtField setReturnKeyType:UIReturnKeyDone]; 
[txtField setClearButtonMode:UITextFieldViewModeWhileEditing]; 

Gracias por cualquier ayuda

Nota: Es decir que el texto no se centra verticalmente en el campo de texto (que es un poco hacia la parte superior). Entonces, establecer la alineación del texto no es la solución.

Añadiendo una imagen del problema para aclararlo: como se ve en la imagen, el texto del marcador de posición está más hacia la parte superior y no hacia el centro en sentido vertical. alt text

+0

1 Gracias Su pregunta me ayudaron .. Lo sentimos –

Respuesta

56

es necesario agregar:

txtField.textAlignment = NSTextAlignmentCenter; // Pre-iOS6 SDK: UITextAlignmentCenter 

Tenga en cuenta que esto se ajusta tanto a la alineación del texto de marcador de posición, así como el texto que el usuario entrará en

Cómo Center. verticalmente

Dado que la pregunta original se actualizó para solicitar cómo alinear verticalmente el texto del marcador de posición y esa respuesta está oculta en los comentarios, re es cómo hacer eso:

txtField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
+1

sobre eso. Supongo que la pregunta fue un poco errónea. Quise decir que el texto no está centrado verticalmente. Actualizó la pregunta. – lostInTransit

+1

Luego, conéctate a una captura de pantalla para que podamos ver exactamente de lo que estás hablando. Nunca he visto esto, y lo he hecho un poco. – jer

+1

Se agregó la imagen también. Por favor, avíseme si eso ayuda a identificar el problema. No estoy seguro de lo que podría estar haciendo mal. ¡El método para crear un campo de texto es bastante sencillo! – lostInTransit

18

Esto no funciona como se esperaba en iOS7. En iOS7, tendrá que anular la clase TextField y

- (void) drawPlaceholderInRect:(CGRect)rect 

método.

De esta manera:

- (void) drawPlaceholderInRect:(CGRect)rect 
{ 
    [[UIColor blueColor] setFill]; 
    CGRect placeholderRect = CGRectMake(rect.origin.x, (rect.size.height- self.font.pointSize)/2, rect.size.width, self.font.pointSize); 
    [[self placeholder] drawInRect:placeholderRect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment]; 
} 

funciona tanto para iOS7 y versiones anteriores.

+7

Usar lineHeight en lugar de pointSize da un mejor resultado en mi opinión. –

2

Estaba usando solo el color, pero también tenemos que configurar la fuente.

Ésta funcionó para mí:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes: 
@{ 
    NSForegroundColorAttributeName:[UIColor whiteColor], 
    NSFontAttributeName: [UIFont systemFontOfSize:12] 
}]; 
+0

Esta debería ser la respuesta aceptada. No sé por qué si no estableces el atributo de fuente, el marcador de posición estará desalineado. Tal vez porque la fuente del marcador de posición y la fuente de texto no es lo mismo. 'contentVerticalAlignment' no funciona (al menos para mí). – kientux

+0

Esto no funciona si usa un tamaño de fuente predeterminado más grande que el marcador de posición. – mattsson

0

cambiar la altura mínima de línea usando NSParagraphStyle fue la única solución que funcionó para mí:

NSMutableParagraphStyle *style = [self.addressBar.defaultTextAttributes[NSParagraphStyleAttributeName] mutableCopy]; 
style.minimumLineHeight = self.addressBar.font.lineHeight - (self.addressBar.font.lineHeight - placeholderFont.lineHeight)/2.0; 

self.addressBar.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder text" attributes:@{ 
    NSForegroundColorAttributeName: [UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f], 
    NSFontAttributeName : placeholderFont, 
    NSParagraphStyleAttributeName : style 
}]; 
Cuestiones relacionadas