Como centralizo verticalmente o texto UITextField?

143

Estou simplesmente instanciando um UITextFielde percebendo que o texto não é centralizado verticalmente. Em vez disso, ele está alinhado com a parte superior do meu botão, o que acho meio estranho, já que eu esperava que o padrão centralizasse verticalmente. Como posso centralizá-lo verticalmente ou há alguma configuração padrão que está faltando?

Joey
fonte

Respostas:

369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Em uso rápido:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Roger
fonte
1
@ user353877: Isso ainda funciona bem. Observe que, na resposta de Roger, textFieldé o nome da UITextFieldinstância dele - a sua pode ser diferente. Então ele terá algo parecido UITextField *textField = [[UITextField alloc] init];. Se você usar um nome de variável diferente (qualquer coisa que não seja textFielddepois do *), precisará fazer isso yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter.
precisa saber é o seguinte
@ user353877 Adicione um ponto imediatamente antes de "Centro": UIControlContentVerticalAlignment.Center;
21715 Josh
1
existe o mesmo método para UITextView?
CaffeineShots
Existe um equivalente rápido para esta propriedade?
Demonofthemist
2
No Swift 3.0, esta é a maneira recomendada de usar uma enumeração:textField.contentVerticalAlignment = .center
Glenn
9

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 / )
características da fonte vertical


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:

letras que não parecem centradas

mas parece certo se são apenas números

números olhando centralizados

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)
}
descaradamente
fonte
Eu acho que isso placeholderRectForBoundsse estende demais para a direita. Eu tenho uma visão correta e ela entra ao contrário dos outros limites. Eu só implementado textRectForBoundse chamou-o dos outros 2 funcs :)
Sasho
5

No storyboard: Sob controle -> altere o alinhamento vertical e horizontal, conforme suas necessidades.

insira a descrição da imagem aqui

Kumar KL
fonte
1

Isso funciona bem para o texto do textField. Mas se você quiser usar o texto do espaço reservado (um texto que aparecerá enquanto o campo de texto estiver em branco), no iOS 7 você encontrará problemas.

Eu o resolvi substituindo a classe TextField e

- (void) drawPlaceholderInRect:(CGRect)rect

método.

Como isso:

- (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 para iOS7 e versões anteriores.

ancajic
fonte
Como você lida com isso no Swift? Porque self.placeholder.drawInRect não existe no Swift.
King-Wizard
isso funciona, mas o self.font.pointSize parece funcionar um pouco melhor que o pointSize
ED-209