Это может привести к нескольким осложняющим факторам, о которых упоминалось в предыдущих ответах:
- То, что вы пытаетесь выровнять (только цифры, только буквы, только заглавные буквы или сочетание)
- Заполнители
- Кнопка очистки
То, что вы пытаетесь выровнять, важно, потому что точка шрифта должна быть вертикально отцентрирована из-за высоты линии, возрастания, спуска и т. Д. (Источник: 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
вместо.