Wie zentriere ich UITextField Text vertikal?

143

Ich instanziiere einfach a UITextFieldund bemerke, dass der Text nicht vertikal zentriert ist. Stattdessen ist es bündig mit der Oberseite meiner Schaltfläche, was ich merkwürdig finde, da ich erwarten würde, dass die Standardeinstellung es vertikal zentriert. Wie kann ich es vertikal zentrieren oder fehlt mir eine Standardeinstellung?

Joey
quelle

Antworten:

369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Im schnellen Einsatz:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Roger
quelle
1
@ user353877: Dies funktioniert immer noch gut. Beachten Sie, dass in Rogers Antwort textFieldder Name seiner UITextFieldInstanz steht - Ihre kann anders sein. Also wird er so etwas haben UITextField *textField = [[UITextField alloc] init];. Wenn Sie einen anderen Variablennamen verwenden (etwas anderes als textFieldnach dem *), müssen Sie dies yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterstattdessen tun .
GeneralMike
@ user353877 Fügen Sie einen Punkt direkt vor "Center" hinzu: UIControlContentVerticalAlignment.Center;
Josh
1
Gibt es dieselbe Methode für UITextView?
CaffeineShots
Gibt es ein schnelles Äquivalent für diese Eigenschaft?
Demonofthemist
2
In Swift 3.0 ist dies die empfohlene Methode zur Verwendung einer Aufzählung:textField.contentVerticalAlignment = .center
Glenn
9

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 / )
vertikale Schriftmerkmale


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:

Buchstaben sehen nicht zentriert aus

sieht aber richtig aus, wenn es nur Zahlen sind

Zahlen, die zentriert aussehen

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)
}
ginchly
quelle
Ich denke das placeholderRectForBoundserstreckt sich zu weit nach rechts. Ich habe eine rechte Sicht und sie geht im Gegensatz zu den anderen Grenzen hinein. Ich habe es gerade implementiert textRectForBoundsund von den anderen 2 Funktionen aufgerufen :)
Sasho
5

Im Storyboard: Unter Kontrolle -> Ändern Sie die vertikale und horizontale Ausrichtung entsprechend Ihren Anforderungen.

Geben Sie hier die Bildbeschreibung ein

Kumar KL
quelle
1

Dies funktioniert gut für textFields Text. Wenn Sie jedoch Platzhaltertext verwenden möchten (ein Text, der angezeigt wird, während das Textfeld leer ist), treten unter iOS 7 Probleme auf.

Ich habe es gelöst, indem ich die TextField-Klasse und überschrieben habe

- (void) drawPlaceholderInRect:(CGRect)rect

Methode.

So was:

- (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];
}

Funktioniert sowohl für iOS7 als auch für frühere Versionen.

ancajic
quelle
Wie gehst du damit in Swift um? Weil self.placeholder.drawInRect in Swift nicht vorhanden ist.
König-Zauberer
Dies funktioniert, aber self.font.pointSize scheint etwas besser zu funktionieren als pointSize
ED-209