Comment centrer verticalement UITextField Text?

143

J'instancie simplement a UITextFieldet je remarque que le texte ne se centre pas verticalement. Au lieu de cela, il est aligné avec le haut de mon bouton, ce que je trouve un peu étrange car je m'attendrais à ce que la valeur par défaut le centre verticalement. Comment puis-je le centrer verticalement ou y a-t-il un paramètre par défaut qui me manque?

Joey
la source

Réponses:

369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

En utilisation rapide:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Roger
la source
1
@ user353877: Cela fonctionne toujours très bien. Notez que dans la réponse de Roger, textFieldest le nom de son UITextFieldinstance - le vôtre peut être différent. Alors il aura quelque chose comme UITextField *textField = [[UITextField alloc] init];. Si vous utilisez un nom de variable différent (autre chose textFieldqu'après le *), vous devez le faire à la yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterplace.
GeneralMike
@ user353877 Ajoutez un point juste avant "Center": UIControlContentVerticalAlignment.Center;
Josh
1
existe-t-il la même méthode pour UITextView?
CaffeineShots
Existe-t-il un équivalent rapide pour cette propriété?
demonofthemist
2
Dans Swift 3.0, c'est la manière recommandée d'utiliser une énumération:textField.contentVerticalAlignment = .center
Glenn
9

Cela a potentiellement plusieurs facteurs de complication, dont certains ont fait allusion dans les réponses précédentes:

  • Ce que vous essayez d'aligner (juste des chiffres, juste des lettres, juste des lettres majuscules ou un mélange)
  • Espaces réservés
  • Bouton Effacer

Ce que vous essayez d'aligner est important car le point de la police doit être centré verticalement en raison de la hauteur de la ligne, des ascendeurs, des descendants, etc. (source: ilovetypography.com ) (Image grâce à http://ilovetypography.com/2009 / 01/14 / métriques-verticales-discrètes / )
caractéristiques de police verticales


Lorsque vous ne traitez que des nombres, par exemple, l'alignement central standard ne semble pas tout à fait correct. Comparez la différence entre les deux ci-dessous, qui utilisent le même alignement (dans le code ci-dessous), dont l'un semble correct et l'autre légèrement décalé:

Pas tout à fait raison avec un mélange de lettres:

les lettres ne semblent pas centrées

mais ça a l'air juste si ce ne sont que des chiffres

les nombres semblent centrés

Donc, malheureusement, il peut avoir besoin d'un peu d'essais et d'erreurs et d'ajustements manuels pour obtenir un rendu visuel correct.

J'ai placé le code ci-dessous dans une sous-classe de UITextField. Il appelle des méthodes de superclasse car cela prend en compte la présence du bouton d'effacement.

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)
}
ginchly
la source
Je pense que le placeholderRectForBoundsva trop vers la droite. J'ai une vision juste et ça y va contrairement aux autres limites. Je viens de l'implémenter textRectForBoundset de l'appeler à partir des 2 autres fonctions :)
Sasho
5

Dans le storyboard: Sous contrôle -> modifiez l'alignement vertical et horizontal, selon vos besoins.

entrez la description de l'image ici

Kumar KL
la source
1

Cela fonctionne très bien pour le texte de textField. Mais si vous souhaitez utiliser du texte d'espace réservé (un texte qui apparaîtra lorsque le champ de texte est vide), sur iOS 7, vous rencontrerez des problèmes.

Je l'ai résolu en remplaçant la classe TextField et

- (void) drawPlaceholderInRect:(CGRect)rect

méthode.

Comme ça:

- (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];
}

Fonctionne pour iOS7 et les versions antérieures.

ancajic
la source
Comment gérez-vous cela dans Swift? Parce que self.placeholder.drawInRect n'existe pas dans Swift.
King-Wizard
cela fonctionne, mais self.font.pointSize semble fonctionner légèrement mieux que pointSize
ED-209