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.
(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 :
mais ça semble correct si ce ne sont que des chiffres
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)
}