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?

Odpowiedzi:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

W szybkim użyciu:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

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)
}

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.