2011-03-25 16 views
142

Simplemente estoy instanciando un UITextField y me doy cuenta de que el texto no se centra verticalmente. En cambio, está alineado con la parte superior de mi botón, lo que me parece un poco extraño ya que esperaría que el valor predeterminado se centrara verticalmente. ¿Cómo puedo centrarlo verticalmente, o hay alguna configuración predeterminada que me falta?¿Cómo centro verticalmente el texto de UITextField?

Respuesta

361
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 

En uso rápida:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center 
+12

una buena idea para un valor por defecto .. –

+5

(no funciona para mí) – user353877

+0

@ user353877: Esto todavía funciona bien. Tenga en cuenta que en la respuesta de Roger, 'textField' es el nombre de su instancia' UITextField'; la suya puede ser diferente. Entonces tendrá algo como 'UITextField * textField = [[UITextField alloc] init];'. Si usa un nombre de variable diferente (cualquier cosa que no sea 'textField' después de' * '), debe hacer' yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter' en su lugar. – GeneralMike

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 resuelto por razones imperiosas de 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.

+0

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

+0

esto funciona, pero self.font.pointSize parece funcionar un poco mejor que pointSize –

3

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

enter image description here

+1

Funcionó para mí. THanks –

7

Potencialmente, esto tiene varios factores que complican, algunos se alude en las respuestas anteriores:

  • Lo que estamos tratando de alinear (sólo números, sólo letras mayúsculas, letras o simplemente una mezcla)
  • marcadores de posición
  • botón Borrar

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

Cuando' Al tratar con números simples, por ejemplo, la alineación central estándar no se verá del todo bien. Comparar la diferencia en el dos por debajo, que utilizan la misma alineación (en el código de abajo), uno de los cuales parece correcto y el otro que se parece un poco fuera:

No está muy bien con una mezcla de letras:

letters not looking centered

, pero se ve bien si es sólo números

numbers looking centered

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

Coloqué el siguiente código en una subclase de UITextField. Llama a los métodos de superclase ya que esto tiene en cuenta que el botón claro 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) 
} 
+0

Creo que el 'placeholderRectForBounds' se extiende demasiado a la derecha. Tengo una visión correcta y entra en ella a diferencia de los otros límites. Acabo de implementar 'textRectForBounds' y lo llamé desde los otros 2 funcs :) – Sasho

Cuestiones relacionadas