Dies hat möglicherweise mehrere komplizierende Faktoren, von denen einige in früheren Antworten erwähnt wurden:
- Was Sie ausrichten möchten (nur Zahlen, nur Buchstaben, nur Großbuchstaben oder eine Mischung)
- Platzhalter
- Schaltfläche Löschen
Was Sie ausrichten möchten, ist wichtig, da der Punkt in der Schrift aufgrund der Linienhöhe, Auf- und Abwärtsbewegungen usw. vertikal zentriert sein sollte (Quelle: ilovetypography.com ) (Bild dank http://ilovetypography.com/2009) / 01/14 / unauffällige-vertikale-Metriken / )
Wenn Sie zum Beispiel nur mit Zahlen arbeiten, sieht die Standardausrichtung der Mitte nicht ganz richtig aus. Vergleichen Sie den Unterschied zwischen den beiden folgenden, die dieselbe Ausrichtung verwenden (im folgenden Code), von denen einer korrekt und der andere leicht abweicht:
Nicht ganz richtig mit einer Mischung aus Buchstaben:
sieht aber richtig aus, wenn es nur Zahlen sind
Leider ist möglicherweise ein wenig Versuch und Irrtum und manuelle Anpassung erforderlich, damit es optisch korrekt aussieht.
Ich habe den folgenden Code in eine Unterklasse von UITextField eingefügt. Es werden Methoden der Oberklasse aufgerufen, da dies die vorhandene Schaltfläche zum Löschen berücksichtigt.
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
der Name seinerUITextField
Instanz steht - Ihre kann anders sein. Also wird er so etwas habenUITextField *textField = [[UITextField alloc] init];
. Wenn Sie einen anderen Variablennamen verwenden (etwas anderes alstextField
nach dem*
), müssen Sie diesyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
stattdessen tun .