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 / )
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:
mais ça a l'air juste si ce ne sont que des chiffres
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)
}
textField
est le nom de sonUITextField
instance - le vôtre peut être différent. Alors il aura quelque chose commeUITextField *textField = [[UITextField alloc] init];
. Si vous utilisez un nom de variable différent (autre chosetextField
qu'après le*
), vous devez le faire à layourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
place.