web-dev-qa-db-fra.com

Comment centrer verticalement le texte UITextField?

Je suis simplement en train d'instancier un UITextField et de constater que le texte ne se centre pas verticalement. Au lieu de cela, il est aligné avec le haut de mon bouton, ce qui me semble un peu étrange puisque 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?

143
Joey
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Dans Swift utilisez:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
367
Roger

Cela a potentiellement plusieurs facteurs de complication, dont certains ont fait allusion dans des 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)
  • Placeholders
  • Bouton effacer

Quoi vous essayez de vous aligner est important car le point de la police doit être centré verticalement à cause de la hauteur de la ligne, des ascendeurs, des descendeurs, etc.
caractéristiques verticales des polices http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
(Image grâce à http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/ )

Par exemple, lorsque vous ne manipulez que des chiffres, 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), l'un d'eux semble correct et l'autre qui semble légèrement décollé:

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

letters not looking centered

mais semble juste s'il ne s'agit que de chiffres

numbers looking centered

Donc, malheureusement, il faudra peut-être un peu d’essais et d’erreurs et un ajustement manuel pour que l’affichage soit correct.

J'ai placé le code ci-dessous dans une sous-classe de UITextField. Il appelle des méthodes de super-classe car cela prend en compte le bouton effacer présent.

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)
}
7
ginchly

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

enter image description here

4
Kumar KL

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

Je l'ai résolu en surchargeant 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.

1
ancajic