Это может привести к нескольким осложняющим факторам, о которых упоминалось в предыдущих ответах:
- То, что вы пытаетесь выровнять (только цифры, только буквы, только заглавные буквы или сочетание)
- Заполнители
- Кнопка очистки
То, что вы пытаетесь выровнять, важно, потому что точка шрифта должна быть вертикально отцентрирована из-за высоты линии, возрастания, спуска и т. Д. (Источник: ilovetypography.com ) (Изображение благодаря http://ilovetypography.com/2009 / 01/14 / незаметно-вертикальная метрика / )

Например, когда вы работаете только с числами, стандартное выравнивание по центру выглядит не совсем правильно. Сравните разницу между двумя ниже, которые используют одинаковое выравнивание (в приведенном ниже коде), одно из которых выглядит правильно, а другое выглядит немного не так:
Не совсем правильно со смесью букв:

но выглядит правильно, если это просто цифры

Так что, к сожалению, может потребоваться немного проб и ошибок и ручная настройка, чтобы выглядело правильно.
Я поместил приведенный ниже код в подкласс UITextField. Он вызывает методы суперкласса, поскольку учитывает наличие кнопки очистки.
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указано имя егоUITextFieldэкземпляра - ваш может отличаться. Так что у него будет что-то подобноеUITextField *textField = [[UITextField alloc] init];. Если вы используете другое имя переменной (что угодно, кромеtextFieldпосле*), вам нужно сделать этоyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterвместо.