Ciò ha potenzialmente diversi fattori complicanti, alcuni citati nelle risposte precedenti:
- Cosa stai cercando di allineare (solo numeri, solo lettere, solo lettere maiuscole o un mix)
- segnaposto
- Pulsante Cancella
Quello che stai cercando di allineare è importante a causa di quale punto del carattere dovrebbe essere centrato verticalmente a causa dell'altezza della linea, degli ascendenti, dei discendenti ecc. (Fonte: ilovetypography.com ) (Immagine grazie a http://ilovetypography.com/2009 / 01/14 / metriche verticali poco appariscenti / )

Quando hai a che fare solo con numeri, ad esempio, l'allineamento centrale standard non sembrerà del tutto corretto. Confronta la differenza tra i due seguenti, che utilizzano lo stesso allineamento (nel codice seguente), uno dei quali sembra corretto e l'altro che appare leggermente diverso:
Non del tutto giusto con un mix di lettere:

ma sembra giusto se sono solo numeri

Quindi, sfortunatamente, potrebbe essere necessario un po 'di tentativi, errori e modifiche manuali per renderlo visivamente corretto.
Ho inserito il codice seguente in una sottoclasse di UITextField. Chiama i metodi di superclasse in quanto tiene conto del pulsante di cancellazione presente.
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
è il nome della suaUITextField
istanza: la tua potrebbe essere diversa. Quindi avrà qualcosa del genereUITextField *textField = [[UITextField alloc] init];
. Se usi un nome di variabile diverso (qualsiasi cosa diversa datextField
dopo il*
), deviyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
invece farlo .