Isso tem vários fatores complicadores, alguns mencionados nas respostas anteriores:
- O que você está tentando alinhar (apenas números, apenas letras, apenas letras maiúsculas ou uma mistura)
- Espaços reservados
- Botão Limpar
O que você está tentando alinhar é importante, pois o ponto da fonte deve ser centralizado verticalmente devido à altura da linha, ascendentes, descendentes etc. (fonte: ilovetypography.com ) (Imagem agradecida a http://ilovetypography.com/2009 / 01/14 / métricas-imperceptíveis-verticais / )
Quando você lida apenas com números, por exemplo, o alinhamento central padrão não parece muito correto. Compare a diferença nos dois abaixo, que usam o mesmo alinhamento (no código abaixo), um dos quais parece correto e o outro que parece um pouco fora:
Não está bem com uma mistura de letras:
mas parece certo se são apenas números
Por isso, infelizmente, pode ser necessário um pouco de tentativa e erro e ajuste manual para fazer com que pareça visualmente correto.
Coloquei o código abaixo em uma subclasse de UITextField. Ele chama métodos de superclasse, pois isso leva em conta o botão Limpar 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
é o nome daUITextField
instância dele - a sua pode ser diferente. Então ele terá algo parecidoUITextField *textField = [[UITextField alloc] init];
. Se você usar um nome de variável diferente (qualquer coisa que não sejatextField
depois do*
), precisará fazer issoyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
.