¿Cómo puedo centrar verticalmente el Texto de UITextField?


Simplemente estoy instanciando un UITextField y notando que el texto no se centra verticalmente. En cambio, está al ras con la parte superior de mi botón, lo que me parece un poco 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?

Author: Paras Joshi, 2011-03-26

4 answers

textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

En uso rápido:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
 364
Author: Roger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 17:41:47

Esto tiene potencialmente varios factores que complican, algunos aludidos en respuestas anteriores:

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

Lo que está tratando de alinear es importante debido a qué punto de la fuente debe estar centrado verticalmente debido a la altura de la línea, ascendentes, descendentes, etc.
características de la fuente vertical http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
(Imagen gracias a http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/ )

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 de abajo, que usan la misma alineación (en el código de abajo), uno de los cuales se ve correcto y el otro que se ve ligeramente apagado:

No muy bien con una mezcla de letras:

letras que no parecen centradas

Pero se ve bien si son solo números

números que parecen centrados

Así que, desafortunadamente, puede necesitar un poco de ensayo y error y ajuste manual para que se vea visualmente correcto.

Coloqué el siguiente código en una subclase de UITextField. Llama a métodos de superclase ya que esto tiene en cuenta que el botón clear 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)
}
 7
Author: ginchly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-22 10:02:01

En el storyboard: Bajo control -> cambie la alineación vertical y horizontal, en cuanto a sus necesidades.

introduzca la descripción de la imagen aquí

 4
Author: Kumar KL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-18 19:40:39

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

Lo resolví anulando la clase TextField y

- (void) drawPlaceholderInRect:(CGRect)rect

Método.

Así:

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

 1
Author: ancajic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-07 11:50:10