144 votes

Comment centrer verticalement le texte d'un UITextField ?

Je suis simplement en train d'instancier un UITextField et remarquez que le texte n'est pas centré verticalement. Au lieu de cela, il est au même niveau que le haut de mon bouton, ce que je trouve étrange puisque je m'attendrais à ce que le texte soit centré verticalement par défaut. Comment puis-je le centrer verticalement ou existe-t-il un paramètre par défaut qui m'échappe ?

371voto

Roger Points 11711
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

En utilisation rapide :

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1 votes

@user353877 : Cela fonctionne toujours bien. Notez que dans la réponse de Roger, textField est le nom de son UITextField instance - la vôtre peut être différente. Il aura donc quelque chose comme UITextField *textField = [[UITextField alloc] init]; . Si vous utilisez un nom de variable différent (tout autre que textField après le * ), vous devez faire yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter à la place.

0 votes

@user353877 Ajouter un point juste avant "Center" : UIControlContentVerticalAlignment.Center ;

1 votes

Existe-t-il une méthode identique pour UITextView ?

10voto

ginchly Points 365

Il existe potentiellement plusieurs facteurs de complication, dont certains ont été évoqués dans les réponses précédentes :

  • Ce que vous essayez d'aligner (uniquement des chiffres, uniquement des lettres, uniquement des lettres majuscules ou un mélange).
  • Placeholders
  • Bouton d'effacement

Quoi que vous essayez d'aligner est importante car elle permet de déterminer quel point de la police doit être centré verticalement en raison de la hauteur de la ligne, des ascendants, des descendants, etc.
vertical font characteristics
(source : <a href="http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png" rel="nofollow noreferrer">ilovetypography.com </a>)

(Image merci à http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/ )

Lorsqu'il s'agit de chiffres, par exemple, l'alignement central standard ne sera pas tout à fait correct. Comparez la différence entre les deux images ci-dessous, qui utilisent le même alignement (dans le code ci-dessous), dont l'une semble correcte et l'autre légèrement décalée :

Pas très bien avec un mélange de lettres :

letters not looking centered

mais ça semble correct si ce ne sont que des chiffres

numbers looking centered

Il faudra donc malheureusement procéder par tâtonnement et procéder à des ajustements manuels pour obtenir un résultat visuel correct.

J'ai placé le code ci-dessous dans une sous-classe de UITextField. Il appelle les méthodes de la 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)
}

0 votes

Je pense que le placeholderRectForBounds s'étend trop vers la droite. J'ai une vue de droite et elle y entre, contrairement aux autres limites. Je viens d'implémenter textRectForBounds et l'a appelé depuis les 2 autres fonctions :)

5voto

Kumar KL Points 4272

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

enter image description here

1voto

ancajic Points 705

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

J'ai résolu le problème 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.

0 votes

Comment gérez-vous cela en Swift ? Parce que self.placeholder.drawInRect n'existe pas en Swift.

0 votes

Cela fonctionne, mais self.font.pointSize semble fonctionner légèrement mieux que pointSize

0voto

SHANG Points 1

Vous pouvez également résoudre le problème en ajustant la ligne de base du texte.

// positive up negativedown
// NSAttributedStringKey.baselineOffset:0

let attDic: [NSAttributedString.Key: Any] = [
    .font: UIFont.systemFont(ofSize: 16),
    .baselineOffset: 0
];

textfield.placeholder = NSAttributedString(string: "....", attributes:  attDic);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X