Это может иметь несколько усложняющих факторов, на которые ссылались в предыдущих ответах:
- То, что вы пытаетесь выровнять (только цифры, только буквы, только заглавные буквы или сочетание)
- заполнители
- Кнопка очистки
Что вы пытаетесь выровнять, важно, потому что точка шрифта должна быть вертикально центрирована из-за высоты линии, по возрастанию, по убыванию и т. Д.
вертикальные характеристики шрифта http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
(Изображение благодаря http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/)
Когда вы имеете дело, например, только с числами, стандартное выравнивание по центру будет выглядеть не совсем правильно. Сравните разницу между двумя ниже, которые используют одинаковое выравнивание (в приведенном ниже коде), одно из которых выглядит правильно, а другое выглядит немного не так:
Не совсем верно со смесью букв:

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

Так что, к сожалению, может потребоваться немного проб и ошибок и ручная настройка, чтобы сделать его визуально правильным.
Я поместил приведенный ниже код в подкласс 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)
}