¿Cómo centro verticalmente el texto UITextField?


143

Simplemente estoy instanciando ay UITextFieldnotando que el texto no se centra verticalmente. En cambio, está al ras con la parte superior de mi botón, lo que me parece extraño, ya que esperaría que el valor predeterminado lo centre verticalmente. ¿Cómo puedo centrarlo verticalmente o hay alguna configuración predeterminada que me falta?

Respuestas:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

En uso rápido:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877: Esto todavía funciona bien. Tenga en cuenta que en la respuesta de Roger, textFieldes el nombre de su UITextFieldinstancia: la suya puede ser diferente. Entonces tendrá algo así UITextField *textField = [[UITextField alloc] init];. Si usa un nombre de variable diferente (cualquier cosa que no sea textFielddespués de *), debe hacerlo en su yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterlugar.
GeneralMike

@ user353877 Agregue un punto justo antes de "Centro": UIControlContentVerticalAlignment.Center;
Josh

1
¿Existe el mismo método para UITextView?
CaffeineShots

¿Existe un equivalente rápido para esta propiedad?
demonofthemist

2
En Swift 3.0, esta es la forma recomendada de usar una enumeración:textField.contentVerticalAlignment = .center
Glenn

9

Potencialmente, esto tiene varios factores complicados, algunos mencionados en respuestas anteriores:

  • Lo que está tratando de alinear (solo números, solo letras, solo letras mayúsculas o una mezcla)
  • Marcadores de posición
  • Botón Borrar

Lo que está intentando alinear es importante porque el punto de la fuente debe estar centrado verticalmente debido a la altura de la línea, ascendentes, descendentes, etc. (fuente: ilovetypography.com ) (Imagen gracias a http://ilovetypography.com/2009 / 01/14 / discreto-vertical-métrica / )
características de fuente vertical


Cuando se trata solo de números, por ejemplo, la alineación central estándar no se verá del todo bien. Compare la diferencia en los dos siguientes, que usan la misma alineación (en el código a continuación), uno de los cuales parece correcto y el otro que se ve ligeramente desviado:

No del todo bien con una mezcla de letras:

las letras no parecen centradas

pero se ve bien si solo son números

números mirando centrados

Entonces, desafortunadamente, puede necesitar un poco de prueba y error y un ajuste manual para que se vea visualmente correcto.

Puse el siguiente código en una subclase de UITextField. Llama a métodos de superclase ya que esto tiene en cuenta el botón de borrado que está presente.

override func awakeFromNib() {
    contentVerticalAlignment = UIControlContentVerticalAlignment.Center
}

override func textRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.textRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.editingRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
    let delta = CGFloat(1)
    return CGRect(x: bounds.minX, y: delta, width: bounds.width, height: bounds.height - delta/2)
}

Creo que se placeholderRectForBoundsextiende demasiado a la derecha. Tengo una vista correcta y entra en ella a diferencia de los otros límites. Acabo de implementarlo textRectForBoundsy lo llamé desde los otros 2 funcs :)
Sasho

5

En el guión gráfico: Bajo control -> cambie la alineación vertical y horizontal, según sus necesidades.

ingrese la descripción de la imagen aquí


1

Esto funciona bien para el texto de textField. Pero si desea utilizar texto de marcador de posición (un texto que aparecerá mientras el campo de texto está en blanco), en iOS 7 encontrará problemas.

Lo resolví anulando la clase TextField y

- (void) drawPlaceholderInRect:(CGRect)rect

método.

Me gusta esto:

- (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 como para versiones anteriores.


¿Cómo manejas eso en Swift? Porque self.placeholder.drawInRect no existe en Swift.
King-Wizard

esto funciona, pero self.font.pointSize parece funcionar un poco mejor que pointSize
ED-209
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.