Jak wyśrodkować tekst UITextField w pionie?

143

Po prostu tworzę wystąpienie a UITextFieldi zauważam, że tekst nie jest wyśrodkowany w pionie. Zamiast tego jest wyrównany z górną częścią mojego przycisku, co wydaje mi się trochę dziwne, ponieważ spodziewałbym się, że domyślny wyśrodkuje go w pionie. Jak wyśrodkować go w pionie, czy brakuje mi jakiegoś domyślnego ustawienia?

Joey
źródło

Odpowiedzi:

369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

W szybkim użyciu:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
zrozumiałem
źródło
1
@ user353877: To nadal działa dobrze. Zwróć uwagę, że w odpowiedzi Rogera textFieldjest nazwa jego UITextFieldinstancji - Twoja może być inna. Więc będzie miał coś takiego UITextField *textField = [[UITextField alloc] init];. Jeśli używasz innej nazwy zmiennej (innej niż textFieldpo *), musisz to zrobić yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter.
GeneralMike,
@ user353877 Dodaj kropkę tuż przed „Center”: UIControlContentVerticalAlignment.Center;
Josh
1
czy istnieje ta sama metoda dla UITextView?
CaffeineShots
Czy istnieje szybki odpowiednik tej nieruchomości?
demonofthemist
2
W Swift 3.0 jest to zalecany sposób używania wyliczenia:textField.contentVerticalAlignment = .center
Glenn
9

Potencjalnie wiąże się to z kilkoma komplikującymi czynnikami, o których mowa w poprzednich odpowiedziach:

  • Co próbujesz wyrównać (tylko cyfry, tylko litery, tylko wielkie litery lub ich mieszanka)
  • Symbole zastępcze
  • Przycisk Wyczyść

To, co próbujesz wyrównać, jest ważne ze względu na to, który punkt czcionki powinien być wyśrodkowany w pionie ze względu na wysokość linii, wznoszące się, opadające itp. (Źródło: ilovetypography.com ) (Zdjęcie dzięki http://ilovetypography.com/2009 / 01/14 / niepozorne-wertykalne-metryki / )
pionowe cechy czcionki


Na przykład, gdy masz do czynienia tylko z liczbami, standardowe wyrównanie do środka nie będzie wyglądać dobrze. Porównaj różnice między dwoma poniższymi, które używają tego samego wyrównania (w poniższym kodzie), z których jedno wygląda na poprawne, a drugie wygląda nieco inaczej:

Niezupełnie w porządku z kombinacją liter:

litery nie wyglądają na wyśrodkowane

ale wygląda dobrze, jeśli to tylko liczby

liczby wyglądające na wyśrodkowane

Tak więc, niestety, może wymagać trochę prób i błędów oraz ręcznej regulacji, aby wyglądał poprawnie wizualnie.

Poniższy kod umieściłem w podklasie UITextField. Wywołuje metody nadklasy, ponieważ bierze pod uwagę obecny przycisk Clear.

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
źródło
Myślę, że placeholderRectForBoundsza bardzo sięga w prawo. Mam słuszny pogląd i to się w to nie zgadza z innymi ograniczeniami. Właśnie zaimplementowałem textRectForBoundsi nazwałem to z pozostałych 2 funkcji :)
Sasho,
5

W scenorysie: Pod kontrolą -> zmień wyrównanie w pionie i poziomie, zgodnie ze swoimi potrzebami.

wprowadź opis obrazu tutaj

Kumar KL
źródło
1

Działa to dobrze w przypadku tekstu textField. Ale jeśli chcesz użyć tekstu zastępczego (tekstu, który pojawi się, gdy pole tekstowe będzie puste), w systemie iOS 7 napotkasz problemy.

Rozwiązałem to, zastępując klasę TextField i

- (void) drawPlaceholderInRect:(CGRect)rect

metoda.

Lubię to:

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

Działa na iOS7 i we wcześniejszych wersjach.

ancajic
źródło
Jak sobie z tym radzisz w Swift? Ponieważ self.placeholder.drawInRect nie istnieje w Swift.
King-Wizard
to działa, ale self.font.pointSize wydaje się działać nieco lepiej niż pointSize
ED-209