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 / )
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:
ale wygląda dobrze, jeśli to tylko liczby
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)
}
textField
jest nazwa jegoUITextField
instancji - Twoja może być inna. Więc będzie miał coś takiegoUITextField *textField = [[UITextField alloc] init];
. Jeśli używasz innej nazwy zmiennej (innej niżtextField
po*
), musisz to zrobićyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
.