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?
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
Dans Swift utilisez:
textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Cela a potentiellement plusieurs facteurs de complication, dont certains ont fait allusion dans des réponses précédentes:
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:
mais semble juste s'il ne s'agit que de chiffres
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)
}
Dans le storyboard: Sous contrôle -> modifiez l'alignement vertical ainsi que l'alignement horizontal, selon vos besoins.
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.