Я просто создаю экземпляр UITextField
и замечаю, что текст не центрируется по вертикали. Вместо этого он заподлицо с верхней частью моей кнопки, и я считаю, что это странно, так как я ожидаю, что по умолчанию центр будет вертикально. Как я могу центрировать его по вертикали, или есть некоторые настройки по умолчанию, которые мне не хватает?
Как вертикально центрировать текст UITextField?
Ответ 1
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
При быстром использовании:
textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Ответ 2
Это может привести к нескольким осложняющим факторам, о которых упоминалось в предыдущих ответах:
- То, что вы пытаетесь выровнять (только цифры, только буквы, только заглавные буквы или сочетание)
- Заполнители
- Кнопка очистки
То, что вы пытаетесь выровнять, важно, потому что точка шрифта должна быть центрирована по вертикали из-за высоты линии, по возрастанию, по убыванию и т.д.
(источник: ilovetypography.com)
(Изображение благодаря 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)
}
Ответ 3
В раскадровке: под контролем → измените вертикальное, а также горизонтальное выравнивание, в зависимости от ваших потребностей.
Ответ 4
Это отлично подходит для текста TextField. Но если вы хотите использовать текст-заполнитель (текст, который будет отображаться, когда текстовое поле пуст), на iOS 7 вы столкнетесь с проблемами.
Я решил это, переопределив класс TextField и
- (void) drawPlaceholderInRect:(CGRect)rect
метод.
Вот так:
- (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];
}
Работает как для iOS7, так и для более ранних версий.