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 / )
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:
pero se ve bien si solo son números
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)
}
textField
es el nombre de suUITextField
instancia: 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 seatextField
después de*
), debe hacerlo en suyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
lugar.